aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2011-04-26 07:53:27 +0200
committerSven Gothel <[email protected]>2011-04-26 07:53:27 +0200
commit360b86f4b5d0e440863c1749fe990e39fbabc51c (patch)
tree6be44962f9cf59740597e1dd745bd2204b150ac1
parentf47230cb4649df13260ac56c5dae6c01dad7c1e7 (diff)
ShaderState: Add 'ownUniform()/ownAttribute()'; rename glFunction -> function; switch program enh. ; Graph lifecycle
Add 'ownUniform()/ownAttribute()' allowing to reset all bound uniforms/attributes, not just active ones plus handling the lifecycle of the owned attributes (destroy). This simplifies the lifecycle of all shader attributes. Rename glFunction -> function .. well, the GL attribute marks them GL related already Switch program enhancement. If switching to new program (unlinked), issue glBindAttributeLocation .. Graph lifecycle cleanup using the above ..
-rwxr-xr-xsrc/jogl/classes/com/jogamp/graph/curve/Region.java2
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java2
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java15
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/Renderer.java47
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderer.java6
-rw-r--r--src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java26
-rw-r--r--src/jogl/classes/com/jogamp/opengl/util/glsl/GLSLArrayHandler.java10
-rw-r--r--src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java494
-rw-r--r--src/jogl/classes/javax/media/opengl/GLArrayData.java2
-rwxr-xr-xsrc/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java6
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java57
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/TextRendererImpl01.java6
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PES2.java34
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java13
-rw-r--r--src/jogl/classes/jogamp/graph/curve/text/GlyphString.java5
-rw-r--r--src/jogl/classes/jogamp/opengl/util/glsl/fixedfunc/FixedFuncPipeline.java122
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java2
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java2
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java4
-rw-r--r--src/test/com/jogamp/opengl/test/junit/jogl/glsl/GLSLMiscHelper.java8
-rw-r--r--src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState01NEWT.java68
-rw-r--r--src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState02NEWT.java115
-rw-r--r--src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLSimple01NEWT.java2
23 files changed, 571 insertions, 477 deletions
diff --git a/src/jogl/classes/com/jogamp/graph/curve/Region.java b/src/jogl/classes/com/jogamp/graph/curve/Region.java
index a759546ba..eb88b787c 100755
--- a/src/jogl/classes/com/jogamp/graph/curve/Region.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/Region.java
@@ -117,7 +117,7 @@ public interface Region {
/** Delete and clean the associated OGL
* objects
*/
- public void destroy(GL2ES2 gl);
+ public void destroy(GL2ES2 gl, RenderState rs);
public AABBox getBounds();
diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java
index 2b4c8b7c5..69fdd5c4a 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java
@@ -79,7 +79,7 @@ public abstract class RegionRenderer extends Renderer {
Iterator<Region> iterator = regions.values().iterator();
while(iterator.hasNext()){
Region region = iterator.next();
- region.destroy(gl);
+ region.destroy(gl, rs);
}
regions.clear();
}
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 6450f9f8b..84323f6e5 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java
@@ -27,29 +27,28 @@
*/
package com.jogamp.graph.curve.opengl;
-import javax.media.opengl.GL;
-import javax.media.opengl.GLProfile;
+import javax.media.opengl.GL2ES2;
import javax.media.opengl.GLUniformData;
-import com.jogamp.common.os.Platform;
-import com.jogamp.common.util.VersionUtil;
import com.jogamp.graph.geom.Vertex;
import com.jogamp.opengl.util.PMVMatrix;
import com.jogamp.opengl.util.glsl.ShaderState;
public interface RenderState {
+ void destroy(GL2ES2 gl);
+
ShaderState getShaderState();
Vertex.Factory<? extends Vertex> getPointFactory();
- PMVMatrix getPMVMatrix();
- GLUniformData getPMVMatrixUniform();
+ PMVMatrix pmvMatrix();
+ GLUniformData getPMVMatrix();
GLUniformData getSharpness();
GLUniformData getAlpha();
GLUniformData getColorStatic();
GLUniformData getStrength();
- RenderState attachTo(GL gl);
- boolean detachFrom(GL gl);
+ RenderState attachTo(GL2ES2 gl);
+ boolean detachFrom(GL2ES2 gl);
StringBuilder toString(StringBuilder sb);
String toString();
diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/Renderer.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/Renderer.java
index 4db917fdd..35022f769 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/Renderer.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/Renderer.java
@@ -63,7 +63,7 @@ public abstract class Renderer {
/**
* Flushes all cached data
- * @see #dispose(GL2ES2)
+ * @see #destroy(GL2ES2)
*/
public abstract void flushCache(GL2ES2 gl);
@@ -130,58 +130,59 @@ public abstract class Renderer {
rs.attachTo(gl);
gl.glEnable(GL2ES2.GL_BLEND);
- gl.glBlendFunc(GL2ES2.GL_SRC_ALPHA, GL2ES2.GL_ONE_MINUS_SRC_ALPHA);
+ gl.glBlendFunc(GL2ES2.GL_SRC_ALPHA, GL2ES2.GL_ONE_MINUS_SRC_ALPHA); // FIXME: alpha blending stage ?
initialized = initShaderProgram(gl);
if(!initialized) {
return false;
}
- if(!rs.getShaderState().glUniform(gl, rs.getPMVMatrixUniform())) {
+ if(!rs.getShaderState().uniform(gl, rs.getPMVMatrix())) {
if(DEBUG){
System.err.println("Error setting PMVMatrix in shader: "+rs.getShaderState());
}
return false;
}
- if(!rs.getShaderState().glUniform(gl, rs.getSharpness())) {
+ if(!rs.getShaderState().uniform(gl, rs.getSharpness())) {
if(DEBUG){
System.err.println("Error setting sharpness in shader: "+rs.getShaderState());
}
return false;
}
- if(!rs.getShaderState().glUniform(gl, rs.getAlpha())) {
+ if(!rs.getShaderState().uniform(gl, rs.getAlpha())) {
if(DEBUG){
System.err.println("Error setting global alpha in shader: "+rs.getShaderState());
}
return false;
}
- if(!rs.getShaderState().glUniform(gl, rs.getColorStatic())) {
+ if(!rs.getShaderState().uniform(gl, rs.getColorStatic())) {
if(DEBUG){
System.err.println("Error setting global color in shader: "+rs.getShaderState());
}
return false;
}
- if(!rs.getShaderState().glUniform(gl, rs.getStrength())) {
+ if(!rs.getShaderState().uniform(gl, rs.getStrength())) {
System.err.println("Error setting antialias strength in shader: "+rs.getShaderState());
}
return initialized;
}
- public void dispose(GL2ES2 gl) {
+ public void destroy(GL2ES2 gl) {
if(!initialized){
if(DEBUG_INSTANCE) {
System.err.println("TextRenderer: Not initialized!");
}
return;
}
+ rs.getShaderState().useProgram(gl, false);
flushCache(gl);
disposeImpl(gl);
- rs.getShaderState().destroy(gl);
+ rs.destroy(gl);
initialized = false;
}
@@ -189,7 +190,7 @@ public abstract class Renderer {
public final ShaderState getShaderState() { return rs.getShaderState(); }
public final void enable(GL2ES2 gl, boolean enable) {
- rs.getShaderState().glUseProgram(gl, enable);
+ rs.getShaderState().useProgram(gl, enable);
}
public float getSharpness() {
@@ -199,7 +200,7 @@ public abstract class Renderer {
public void setSharpness(GL2ES2 gl, float v) {
rs.getSharpness().setData(v);
if(null != gl && rs.getShaderState().inUse()) {
- rs.getShaderState().glUniform(gl, rs.getSharpness());
+ rs.getShaderState().uniform(gl, rs.getSharpness());
}
}
@@ -210,7 +211,7 @@ public abstract class Renderer {
public void setStrength(GL2ES2 gl, float v) {
rs.getStrength().setData(v);
if(null != gl && rs.getShaderState().inUse()) {
- rs.getShaderState().glUniform(gl, rs.getStrength());
+ rs.getShaderState().uniform(gl, rs.getStrength());
}
}
@@ -221,7 +222,7 @@ public abstract class Renderer {
public void setAlpha(GL2ES2 gl, float alpha_t) {
rs.getAlpha().setData(alpha_t);
if(null != gl && rs.getShaderState().inUse()) {
- rs.getShaderState().glUniform(gl, rs.getAlpha());
+ rs.getShaderState().uniform(gl, rs.getAlpha());
}
}
@@ -239,36 +240,36 @@ public abstract class Renderer {
fb.put(1, g);
fb.put(2, b);
if(null != gl && rs.getShaderState().inUse()) {
- rs.getShaderState().glUniform(gl, rs.getColorStatic());
+ rs.getShaderState().uniform(gl, rs.getColorStatic());
}
}
- public final PMVMatrix getMatrix() { return rs.getPMVMatrix(); }
+ public final PMVMatrix getMatrix() { return rs.pmvMatrix(); }
public void rotate(GL2ES2 gl, float angle, float x, float y, float z) {
- rs.getPMVMatrix().glRotatef(angle, x, y, z);
+ rs.pmvMatrix().glRotatef(angle, x, y, z);
updateMatrix(gl);
}
public void translate(GL2ES2 gl, float x, float y, float z) {
- rs.getPMVMatrix().glTranslatef(x, y, z);
+ rs.pmvMatrix().glTranslatef(x, y, z);
updateMatrix(gl);
}
public void scale(GL2ES2 gl, float x, float y, float z) {
- rs.getPMVMatrix().glScalef(x, y, z);
+ rs.pmvMatrix().glScalef(x, y, z);
updateMatrix(gl);
}
public void resetModelview(GL2ES2 gl) {
- rs.getPMVMatrix().glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
- rs.getPMVMatrix().glLoadIdentity();
+ rs.pmvMatrix().glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
+ rs.pmvMatrix().glLoadIdentity();
updateMatrix(gl);
}
public void updateMatrix(GL2ES2 gl) {
if(initialized && null != gl && rs.getShaderState().inUse()) {
- rs.getShaderState().glUniform(gl, rs.getPMVMatrixUniform());
+ rs.getShaderState().uniform(gl, rs.getPMVMatrix());
}
}
@@ -276,7 +277,7 @@ public abstract class Renderer {
this.vp_width = width;
this.vp_height = height;
final float ratio = (float)width/(float)height;
- final PMVMatrix p = rs.getPMVMatrix();
+ final PMVMatrix p = rs.pmvMatrix();
p.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
p.glLoadIdentity();
p.gluPerspective(angle, ratio, near, far);
@@ -287,7 +288,7 @@ public abstract class Renderer {
public boolean reshapeOrtho(GL2ES2 gl, int width, int height, float near, float far) {
this.vp_width = width;
this.vp_height = height;
- final PMVMatrix p = rs.getPMVMatrix();
+ final PMVMatrix p = rs.pmvMatrix();
p.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
p.glLoadIdentity();
p.glOrthof(0, width, 0, height, near, far);
diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderer.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderer.java
index a955d5a88..deaa1dfad 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderer.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderer.java
@@ -96,7 +96,7 @@ public abstract class TextRenderer extends Renderer {
Iterator<GlyphString> iterator = stringCacheMap.values().iterator();
while(iterator.hasNext()){
GlyphString glyphString = iterator.next();
- glyphString.destroy(gl);
+ glyphString.destroy(gl, rs);
}
stringCacheMap.clear();
stringCacheArray.clear();
@@ -167,7 +167,7 @@ public abstract class TextRenderer extends Renderer {
final String key = getKey(font, str, fontSize);
GlyphString glyphString = stringCacheMap.remove(key);
if(null != glyphString) {
- glyphString.destroy(gl);
+ glyphString.destroy(gl, rs);
}
stringCacheArray.remove(key);
}
@@ -176,7 +176,7 @@ public abstract class TextRenderer extends Renderer {
final String key = stringCacheArray.remove(idx);
final GlyphString glyphString = stringCacheMap.remove(key);
if(null != glyphString) {
- glyphString.destroy(gl);
+ glyphString.destroy(gl, rs);
}
}
diff --git a/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java b/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
index cb9e4cce5..9e92a9a1d 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
@@ -37,7 +37,7 @@ public class ImmModeSink {
* a ShaderState must be current, using ShaderState.glUseProgram().
*
* @see #draw(GL, boolean)
- * @see com.jogamp.opengl.util.glsl.ShaderState#glUseProgram(GL2ES2, boolean)
+ * @see com.jogamp.opengl.util.glsl.ShaderState#useProgram(GL2ES2, boolean)
* @see com.jogamp.opengl.util.glsl.ShaderState#getCurrentShaderState()
*/
public static ImmModeSink createGLSL(GL gl, int glBufferUsage, int initialSize,
@@ -762,35 +762,35 @@ public class ImmModeSink {
}
if(vComps>0) {
- st.glEnableVertexAttribArray(glsl, vArrayData);
- st.glVertexAttribPointer(glsl, vArrayData);
+ st.enableVertexAttribArray(glsl, vArrayData);
+ st.vertexAttribPointer(glsl, vArrayData);
}
if(cComps>0) {
- st.glEnableVertexAttribArray(glsl, cArrayData);
- st.glVertexAttribPointer(glsl, cArrayData);
+ st.enableVertexAttribArray(glsl, cArrayData);
+ st.vertexAttribPointer(glsl, cArrayData);
}
if(nComps>0) {
- st.glEnableVertexAttribArray(glsl, nArrayData);
- st.glVertexAttribPointer(glsl, nArrayData);
+ st.enableVertexAttribArray(glsl, nArrayData);
+ st.vertexAttribPointer(glsl, nArrayData);
}
if(tComps>0) {
- st.glEnableVertexAttribArray(glsl, tArrayData);
- st.glVertexAttribPointer(glsl, tArrayData);
+ st.enableVertexAttribArray(glsl, tArrayData);
+ st.vertexAttribPointer(glsl, tArrayData);
}
glsl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
} else {
if(vComps>0) {
- st.glDisableVertexAttribArray(glsl, vArrayData);
+ st.disableVertexAttribArray(glsl, vArrayData);
}
if(cComps>0) {
- st.glDisableVertexAttribArray(glsl, cArrayData);
+ st.disableVertexAttribArray(glsl, cArrayData);
}
if(nComps>0) {
- st.glDisableVertexAttribArray(glsl, nArrayData);
+ st.disableVertexAttribArray(glsl, nArrayData);
}
if(tComps>0) {
- st.glDisableVertexAttribArray(glsl, tArrayData);
+ st.disableVertexAttribArray(glsl, tArrayData);
}
}
}
diff --git a/src/jogl/classes/com/jogamp/opengl/util/glsl/GLSLArrayHandler.java b/src/jogl/classes/com/jogamp/opengl/util/glsl/GLSLArrayHandler.java
index f771ea019..73a1c2721 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/glsl/GLSLArrayHandler.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/glsl/GLSLArrayHandler.java
@@ -53,7 +53,7 @@ public class GLSLArrayHandler implements GLArrayHandler {
GL2ES2 glsl = gl.getGL2ES2();
if(enable) {
- st.glEnableVertexAttribArray(glsl, ad);
+ st.enableVertexAttribArray(glsl, ad);
Buffer buffer = ad.getBuffer();
@@ -68,7 +68,7 @@ public class GLSLArrayHandler implements GLArrayHandler {
glsl.glBufferData(ad.getVBOTarget(), ad.getByteSize(), buffer, ad.getVBOUsage());
}
ad.setVBOWritten(true);
- st.glVertexAttribPointer(glsl, ad);
+ st.vertexAttribPointer(glsl, ad);
} else {
// didn't experience a performance hit on this query ..
int[] qi = new int[1];
@@ -78,18 +78,18 @@ public class GLSLArrayHandler implements GLArrayHandler {
System.err.println("XXX VA "+ad.getName()+" VBO rebind: "+qi[0]+" -> "+ad.getVBOName());
}
glsl.glBindBuffer(ad.getVBOTarget(), ad.getVBOName());
- st.glVertexAttribPointer(glsl, ad);
+ st.vertexAttribPointer(glsl, ad);
}
}
} else if(null!=buffer) {
- st.glVertexAttribPointer(glsl, ad);
+ st.vertexAttribPointer(glsl, ad);
ad.setVBOWritten(true);
}
} else {
if(ad.isVBO()) {
glsl.glBindBuffer(ad.getVBOTarget(), 0);
}
- st.glDisableVertexAttribArray(glsl, ad);
+ st.disableVertexAttribArray(glsl, ad);
}
}
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 de77a1941..f8fe987d7 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java
@@ -29,6 +29,7 @@
package com.jogamp.opengl.util.glsl;
import java.security.AccessController;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -58,7 +59,7 @@ public class ShaderState {
/**
* Fetches the current shader state from this thread (TLS) current GLContext
*
- * @see com.jogamp.opengl.util.glsl.ShaderState#glUseProgram(GL2ES2, boolean)
+ * @see com.jogamp.opengl.util.glsl.ShaderState#useProgram(GL2ES2, boolean)
* @see com.jogamp.opengl.util.glsl.ShaderState#getShaderState(GL)
* @see com.jogamp.opengl.util.glsl.ShaderState#getCurrentShaderState()
*/
@@ -71,7 +72,7 @@ public class ShaderState {
*
* @param gl the GL object referencing the GLContext
*
- * @see com.jogamp.opengl.util.glsl.ShaderState#glUseProgram(GL2ES2, boolean)
+ * @see com.jogamp.opengl.util.glsl.ShaderState#useProgram(GL2ES2, boolean)
* @see com.jogamp.opengl.util.glsl.ShaderState#getShaderState(GL)
* @see com.jogamp.opengl.util.glsl.ShaderState#getCurrentShaderState()
*/
@@ -130,32 +131,36 @@ public class ShaderState {
* if <code>on</code> is <code>true</code>.
*
* @throws GLException if no program is attached
- * @throws GLException if no program is not linked
*
- * @see com.jogamp.opengl.util.glsl.ShaderState#glUseProgram(GL2ES2, boolean)
+ * @see com.jogamp.opengl.util.glsl.ShaderState#useProgram(GL2ES2, boolean)
* @see com.jogamp.opengl.util.glsl.ShaderState#getShaderState(GL)
* @see com.jogamp.opengl.util.glsl.ShaderState#getCurrentShaderState()
*/
- public synchronized void glUseProgram(GL2ES2 gl, boolean on) {
- if(null==shaderProgram) { throw new GLException("No program is attached"); }
+ public synchronized void useProgram(GL2ES2 gl, boolean on) throws GLException {
+ if(null==shaderProgram) { throw new GLException("No program is attached"); }
if(on) {
- shaderProgram.useProgram(gl, true);
// update the current ShaderState to the TLS ..
gl.getContext().attachObject(ShaderState.class.getName(), this);
- if(resetAllShaderData) {
- resetAllShaderData = false;
- glResetAllVertexAttributes(gl);
- glResetAllUniforms(gl);
+ if(shaderProgram.linked()) {
+ shaderProgram.useProgram(gl, true);
+ if(resetAllShaderData) {
+ resetAllAttributes(gl);
+ resetAllUniforms(gl);
+ }
+ } else if(resetAllShaderData) {
+ setAllAttributes(gl);
+ if(!shaderProgram.link(gl, System.err)) {
+ throw new GLException("could not link program: "+shaderProgram);
+ }
+ shaderProgram.useProgram(gl, true);
+ resetAllUniforms(gl);
}
+ resetAllShaderData = false;
} else {
shaderProgram.useProgram(gl, false);
}
}
- public synchronized void glUseProgram(GL2ES2 gl, ShaderProgram prog, boolean on) {
-
- }
-
public boolean linked() {
return (null!=shaderProgram)?shaderProgram.linked():false;
}
@@ -167,11 +172,16 @@ public class ShaderState {
/**
* Attach or switch a shader program
*
- * Attaching a shader program the first time,
+ * <p>Attaching a shader program the first time,
* as well as switching to another program on the fly,
- * while managing all attribute and uniform data.
+ * while managing all attribute and uniform data.</p>
+ *
+ * <p>[Re]sets all data and use program in case of a program switch.<br>
+ * Use program if linked in case of a 1st time attachment.</p>
+ *
+ * @throws GLException if program was not linked and linking fails
*/
- public synchronized void attachShaderProgram(GL2ES2 gl, ShaderProgram prog) {
+ public synchronized void attachShaderProgram(GL2ES2 gl, ShaderProgram prog) throws GLException {
boolean prgInUse = false; // earmarked state
if(DEBUG) {
@@ -192,7 +202,7 @@ public class ShaderState {
return;
}
prgInUse = shaderProgram.inUse();
- glUseProgram(gl, false);
+ useProgram(gl, false);
resetAllShaderData = true;
}
@@ -200,9 +210,10 @@ public class ShaderState {
shaderProgram = prog;
if(null!=shaderProgram) {
- // reinstall all data ..
- if(shaderProgram.linked()) {
- glUseProgram(gl, true);
+ // [re]set all data and use program if switching program,
+ // or use program if program is linked
+ if(shaderProgram.linked() || resetAllShaderData) {
+ useProgram(gl, true);
if(!prgInUse) {
shaderProgram.useProgram(gl, false);
}
@@ -216,27 +227,27 @@ public class ShaderState {
public ShaderProgram shaderProgram() { return shaderProgram; }
/**
- * Calls release(gl, true, true)
+ * Calls {@link #release(GL2ES2, boolean, boolean, boolean) release(gl, true, true, true)}
*
* @see #glReleaseAllVertexAttributes
* @see #glReleaseAllUniforms
- * @see #release(GL2ES2, boolean, boolean)
+ * @see #release(GL2ES2, boolean, boolean, boolean)
*/
public synchronized void destroy(GL2ES2 gl) {
- release(gl, true, true);
+ release(gl, true, true, true);
attachedObjectsByString.clear();
attachedObjectsByInt.clear();
}
/**
- * Calls release(gl, false, false)
+ * Calls {@link #release(GL2ES2, boolean, boolean, boolean) release(gl, false, false, false)}
*
* @see #glReleaseAllVertexAttributes
* @see #glReleaseAllUniforms
- * @see #release(GL2ES2, boolean, boolean)
+ * @see #release(GL2ES2, boolean, boolean, boolean)
*/
public synchronized void releaseAllData(GL2ES2 gl) {
- release(gl, false, false);
+ release(gl, false, false, false);
}
/**
@@ -244,22 +255,21 @@ public class ShaderState {
* @see #glReleaseAllUniforms
* @see ShaderProgram#release(GL2ES2, boolean)
*/
- public synchronized void release(GL2ES2 gl, boolean releaseProgramToo, boolean releaseShaderToo) {
- boolean prgInUse = false;
- if(null!=shaderProgram) {
- prgInUse = shaderProgram.inUse();
- if(!prgInUse) {
- shaderProgram.useProgram(gl, true);
- }
+ public synchronized void release(GL2ES2 gl, boolean destroyBoundAttributes, boolean releaseProgramToo, boolean releaseShaderToo) {
+ if(null!=shaderProgram) {
+ shaderProgram.useProgram(gl, false);
+ }
+ if(destroyBoundAttributes) {
+ for(Iterator<GLArrayData> iter = managedAttributes.iterator(); iter.hasNext(); ) {
+ iter.next().destroy(gl);
+ }
}
- glReleaseAllVertexAttributes(gl);
- glReleaseAllUniforms(gl);
+ releaseAllAttributes(gl);
+ releaseAllUniforms(gl);
if(null!=shaderProgram) {
if(releaseProgramToo) {
shaderProgram.release(gl, releaseShaderToo);
- } else if(!prgInUse) {
- shaderProgram.useProgram(gl, false);
- }
+ }
}
}
@@ -273,13 +283,13 @@ public class ShaderState {
* @return -1 if there is no such attribute available,
* otherwise >= 0
*
- * @see #glBindAttribLocation(GL2ES2, int, String)
- * @see #glBindAttribLocation(GL2ES2, int, GLArrayData)
- * @see #glGetAttribLocation(GL2ES2, String)
+ * @see #bindAttribLocation(GL2ES2, int, String)
+ * @see #bindAttribLocation(GL2ES2, int, GLArrayData)
+ * @see #getAttribLocation(GL2ES2, String)
* @see GL2ES2#glGetAttribLocation(int, String)
*/
public int getAttribLocation(String name) {
- Integer idx = (Integer) attribMap2Location.get(name);
+ Integer idx = (Integer) activeAttribLocationMap.get(name);
return (null!=idx)?idx.intValue():-1;
}
@@ -288,7 +298,7 @@ public class ShaderState {
*
* @return the GLArrayData object, null if not previously set.
*
- * @see #bindAttribute(GLArrayData)
+ * @see #ownAttribute(GLArrayData, boolean)
*
* @see #glEnableVertexAttribArray
* @see #glDisableVertexAttribArray
@@ -299,26 +309,40 @@ public class ShaderState {
* @see ShaderProgram#glReplaceShader
*/
public GLArrayData getAttribute(String name) {
- return (GLArrayData) vertexAttribMap2Data.get(name);
+ return (GLArrayData) activeAttribDataMap.get(name);
}
/**
- * Bind the {@link GLArrayData} to this ShaderState.
- * If an attribute location is cached (ie {@link #glBindAttribLocation(GL2ES2, int, String)})
- * it is promoted to the {@link GLArrayData} instance.
- * To bind a {@link GLArrayData} with a given location
- * {@link #glBindAttribLocation(GL2ES2, int, GLArrayData)} shall be used.
+ * Binds or unbinds the {@link GLArrayData} lifecycle to this ShaderState.
+ *
+ * <p>If an attribute location is cached (ie {@link #bindAttribLocation(GL2ES2, int, String)})
+ * it is promoted to the {@link GLArrayData} instance.</p>
*
- * @param data the {@link GLArrayData} to be processed
- * @see #glBindAttribLocation(GL2ES2, int, String)
+ * <p>The attribute will be destroyed with {@link #destroy(GL2ES2)}
+ * and it's location will be reset when switching shader with {@link #attachShaderProgram(GL2ES2, ShaderProgram)}.</p>
+ *
+ * <p>The data will not be transfered to the GPU, use {@link #vertexAttribPointer(GL2ES2, GLArrayData)} additionally.</p>
+ *
+ * @param attribute the {@link GLArrayData} which lifecycle shall be managed
+ * @param own true if <i>owning</i> shall be performs, false if <i>disowning</i>.
+ *
+ * @see #bindAttribLocation(GL2ES2, int, String)
* @see #getAttribute(String)
*/
- public void bindAttribute(GLArrayData data) {
- final int location = getAttribLocation(data.getName());
- if(0<=location) {
- data.setLocation(location);
+ public void ownAttribute(GLArrayData attribute, boolean own) {
+ if(own) {
+ final int location = getAttribLocation(attribute.getName());
+ if(0<=location) {
+ attribute.setLocation(location);
+ }
+ managedAttributes.add(managedAttributes.size(), attribute);
+ } else {
+ managedAttributes.remove(attribute);
}
- vertexAttribMap2Data.put(data.getName(), data);
+ }
+
+ public boolean ownsAttribute(GLArrayData attribute) {
+ return managedAttributes.contains(attribute);
}
/**
@@ -331,14 +355,14 @@ public class ShaderState {
* @throws GLException if the program is already linked
*
* @see javax.media.opengl.GL2ES2#glBindAttribLocation(int, int, String)
- * @see #glGetAttribLocation(GL2ES2, String)
+ * @see #getAttribLocation(GL2ES2, String)
* @see #getAttribLocation(String)
*/
- public void glBindAttribLocation(GL2ES2 gl, int location, String name) {
+ public void bindAttribLocation(GL2ES2 gl, int location, String name) {
if(null==shaderProgram) throw new GLException("No program is attached");
if(shaderProgram.linked()) throw new GLException("Program is already linked");
final Integer loc = new Integer(location);
- attribMap2Location.put(name, loc);
+ activeAttribLocationMap.put(name, loc);
gl.glBindAttribLocation(shaderProgram.program(), location, name);
}
@@ -353,14 +377,14 @@ public class ShaderState {
* @throws GLException if the program is already linked
*
* @see javax.media.opengl.GL2ES2#glBindAttribLocation(int, int, String)
- * @see #glGetAttribLocation(GL2ES2, String)
+ * @see #getAttribLocation(GL2ES2, String)
* @see #getAttribLocation(String)
* @see #getAttribute(String)
*/
- public void glBindAttribLocation(GL2ES2 gl, int location, GLArrayData data) {
- glBindAttribLocation(gl, location, data.getName());
+ public void bindAttribLocation(GL2ES2 gl, int location, GLArrayData data) {
+ bindAttribLocation(gl, location, data.getName());
data.setLocation(location);
- vertexAttribMap2Data.put(data.getName(), data);
+ activeAttribDataMap.put(data.getName(), data);
}
/**
@@ -375,11 +399,11 @@ public class ShaderState {
* @throws GLException if the program is not linked and no location was cached.
*
* @see #getAttribLocation(String)
- * @see #glBindAttribLocation(GL2ES2, int, GLArrayData)
- * @see #glBindAttribLocation(GL2ES2, int, String)
+ * @see #bindAttribLocation(GL2ES2, int, GLArrayData)
+ * @see #bindAttribLocation(GL2ES2, int, String)
* @see GL2ES2#glGetAttribLocation(int, String)
*/
- public int glGetAttribLocation(GL2ES2 gl, String name) {
+ public int getAttribLocation(GL2ES2 gl, String name) {
if(null==shaderProgram) throw new GLException("No program is attached");
int location = getAttribLocation(name);
if(0>location) {
@@ -387,7 +411,7 @@ public class ShaderState {
location = gl.glGetAttribLocation(shaderProgram.program(), name);
if(0<=location) {
Integer idx = new Integer(location);
- attribMap2Location.put(name, idx);
+ activeAttribLocationMap.put(name, idx);
if(DEBUG) {
System.err.println("Info: glGetAttribLocation: "+name+", loc: "+location);
}
@@ -413,15 +437,15 @@ public class ShaderState {
* @throws GLException if the program is not linked and no location was cached.
*
* @see #getAttribLocation(String)
- * @see #glBindAttribLocation(GL2ES2, int, GLArrayData)
- * @see #glBindAttribLocation(GL2ES2, int, String)
+ * @see #bindAttribLocation(GL2ES2, int, GLArrayData)
+ * @see #bindAttribLocation(GL2ES2, int, String)
* @see GL2ES2#glGetAttribLocation(int, String)
* @see #getAttribute(String)
*/
- public int glGetAttribLocation(GL2ES2 gl, GLArrayData data) {
- int location = glGetAttribLocation(gl, data.getName());
+ public int getAttribLocation(GL2ES2 gl, GLArrayData data) {
+ int location = getAttribLocation(gl, data.getName());
data.setLocation(location);
- vertexAttribMap2Data.put(data.getName(), data);
+ activeAttribDataMap.put(data.getName(), data);
return location;
}
@@ -433,7 +457,7 @@ public class ShaderState {
* @return true if the named attribute is enable
*/
public final boolean isVertexAttribArrayEnabled(String name) {
- return enabledVertexAttribArraySet.contains(name);
+ return enabledAttributes.contains(name);
}
/**
@@ -443,10 +467,10 @@ public class ShaderState {
return isVertexAttribArrayEnabled(data.getName());
}
- private boolean glEnableVertexAttribArray(GL2ES2 gl, String name, int location) {
- enabledVertexAttribArraySet.add(name);
+ private boolean enableVertexAttribArray(GL2ES2 gl, String name, int location) {
+ enabledAttributes.add(name);
if(0>location) {
- location = glGetAttribLocation(gl, name);
+ location = getAttribLocation(gl, name);
if(0>location) {
if(verbose) {
Throwable tX = new Throwable("Info: glEnableVertexAttribArray failed, no index for: "+name);
@@ -465,15 +489,14 @@ public class ShaderState {
/**
* Enables a vertex attribute array.
*
- * This method retrieves the the location via {@link #glGetAttribLocation(GL2ES2, GLArrayData)}
- * hence {@link #glEnableVertexAttribArray(GL2ES2, GLArrayData)} shall be preferred.
+ * This method retrieves the the location via {@link #getAttribLocation(GL2ES2, GLArrayData)}
+ * hence {@link #enableVertexAttribArray(GL2ES2, GLArrayData)} shall be preferred.
*
* Even if the attribute is not found in the current shader,
* it is marked enabled in this state.
*
* @return false, if the name is not found, otherwise true
*
- * @throws GLException if no program is attached
* @throws GLException if the program is not linked and no location was cached.
*
* @see #glEnableVertexAttribArray
@@ -481,8 +504,8 @@ public class ShaderState {
* @see #glVertexAttribPointer
* @see #getVertexAttribPointer
*/
- public boolean glEnableVertexAttribArray(GL2ES2 gl, String name) {
- return glEnableVertexAttribArray(gl, name, -1);
+ public boolean enableVertexAttribArray(GL2ES2 gl, String name) {
+ return enableVertexAttribArray(gl, name, -1);
}
@@ -490,8 +513,8 @@ public class ShaderState {
* Enables a vertex attribute array, usually invoked by {@link GLArrayDataEditable#enableBuffer(GL, boolean)}.
*
* This method uses the {@link GLArrayData}'s location if set
- * and is the preferred alternative to {@link #glEnableVertexAttribArray(GL2ES2, String)}.
- * If data location is unset it will be retrieved via {@link #glGetAttribLocation(GL2ES2, GLArrayData)} set
+ * and is the preferred alternative to {@link #enableVertexAttribArray(GL2ES2, String)}.
+ * If data location is unset it will be retrieved via {@link #getAttribLocation(GL2ES2, GLArrayData)} set
* and cached in this state.
*
* Even if the attribute is not found in the current shader,
@@ -499,7 +522,6 @@ public class ShaderState {
*
* @return false, if the name is not found, otherwise true
*
- * @throws GLException if no program is attached
* @throws GLException if the program is not linked and no location was cached.
*
* @see #glEnableVertexAttribArray
@@ -508,21 +530,20 @@ public class ShaderState {
* @see #getVertexAttribPointer
* @see GLArrayDataEditable#enableBuffer(GL, boolean)
*/
- public boolean glEnableVertexAttribArray(GL2ES2 gl, GLArrayData data) {
- if(null==shaderProgram) throw new GLException("No program is attached");
+ public boolean enableVertexAttribArray(GL2ES2 gl, GLArrayData data) {
if(0 > data.getLocation()) {
- glGetAttribLocation(gl, data);
+ getAttribLocation(gl, data);
} else {
// ensure data is the current bound one
- vertexAttribMap2Data.put(data.getName(), data);
+ activeAttribDataMap.put(data.getName(), data);
}
- return glEnableVertexAttribArray(gl, data.getName(), data.getLocation());
+ return enableVertexAttribArray(gl, data.getName(), data.getLocation());
}
- private boolean glDisableVertexAttribArray(GL2ES2 gl, String name, int location) {
- enabledVertexAttribArraySet.remove(name);
+ private boolean disableVertexAttribArray(GL2ES2 gl, String name, int location) {
+ enabledAttributes.remove(name);
if(0>location) {
- location = glGetAttribLocation(gl, name);
+ location = getAttribLocation(gl, name);
if(0>location) {
if(verbose) {
Throwable tX = new Throwable("Info: glDisableVertexAttribArray failed, no index for: "+name);
@@ -541,8 +562,8 @@ public class ShaderState {
/**
* Disables a vertex attribute array
*
- * This method retrieves the the location via {@link #glGetAttribLocation(GL2ES2, GLArrayData)}
- * hence {@link #glDisableVertexAttribArray(GL2ES2, GLArrayData)} shall be preferred.
+ * This method retrieves the the location via {@link #getAttribLocation(GL2ES2, GLArrayData)}
+ * hence {@link #disableVertexAttribArray(GL2ES2, GLArrayData)} shall be preferred.
*
* Even if the attribute is not found in the current shader,
* it is removed from this state enabled list.
@@ -557,16 +578,16 @@ public class ShaderState {
* @see #glVertexAttribPointer
* @see #getVertexAttribPointer
*/
- public boolean glDisableVertexAttribArray(GL2ES2 gl, String name) {
- return glDisableVertexAttribArray(gl, name, -1);
+ public boolean disableVertexAttribArray(GL2ES2 gl, String name) {
+ return disableVertexAttribArray(gl, name, -1);
}
/**
* Disables a vertex attribute array
*
* This method uses the {@link GLArrayData}'s location if set
- * and is the preferred alternative to {@link #glDisableVertexAttribArray(GL2ES2, String)}.
- * If data location is unset it will be retrieved via {@link #glGetAttribLocation(GL2ES2, GLArrayData)} set
+ * and is the preferred alternative to {@link #disableVertexAttribArray(GL2ES2, String)}.
+ * If data location is unset it will be retrieved via {@link #getAttribLocation(GL2ES2, GLArrayData)} set
* and cached in this state.
*
* Even if the attribute is not found in the current shader,
@@ -582,41 +603,40 @@ public class ShaderState {
* @see #glVertexAttribPointer
* @see #getVertexAttribPointer
*/
- public boolean glDisableVertexAttribArray(GL2ES2 gl, GLArrayData data) {
- if(null==shaderProgram) throw new GLException("No program is attached");
+ public boolean disableVertexAttribArray(GL2ES2 gl, GLArrayData data) {
if(0 > data.getLocation()) {
- glGetAttribLocation(gl, data);
+ getAttribLocation(gl, data);
}
- return glDisableVertexAttribArray(gl, data.getName(), data.getLocation());
+ return disableVertexAttribArray(gl, data.getName(), data.getLocation());
}
/**
* Set the {@link GLArrayData} vertex attribute data.
*
* This method uses the {@link GLArrayData}'s location if set.
- * If data location is unset it will be retrieved via {@link #glGetAttribLocation(GL2ES2, GLArrayData)}, set
+ * If data location is unset it will be retrieved via {@link #getAttribLocation(GL2ES2, GLArrayData)}, set
* and cached in this state.
*
* @return false, if the location could not be determined, otherwise true
*
- * @throws GLException if the program is not in use
- *
+ * @throws GLException if no program is attached
+ * @throws GLException if the program is not linked and no location was cached.
+ *
* @see #glEnableVertexAttribArray
* @see #glDisableVertexAttribArray
* @see #glVertexAttribPointer
* @see #getVertexAttribPointer
*/
- public boolean glVertexAttribPointer(GL2ES2 gl, GLArrayData data) {
- if(null==shaderProgram) throw new GLException("No program is attached");
- // if(!shaderProgram.inUse()) throw new GLException("Program is not in use");
- if(0 > data.getLocation()) {
- glGetAttribLocation(gl, data);
- } /* else {
- // Already achieved by glEnableVertexAttribArray(..)
+ public boolean vertexAttribPointer(GL2ES2 gl, GLArrayData data) {
+ int location = data.getLocation();
+ if(0 > location) {
+ location = getAttribLocation(gl, data);
+ } /* else {
+ done via enable ..
// ensure data is the current bound one
- vertexAttribMap2Data.put(data.getName(), data);
+ activeAttribDataMap.put(data.getName(), data);
} */
- if(0 <= data.getLocation()) {
+ if(0 <= location) {
// only pass the data, if the attribute exists in the current shader
if(DEBUG) {
System.err.println("Info: glVertexAttribPointer: "+data);
@@ -631,8 +651,6 @@ public class ShaderState {
* Releases all mapped vertex attribute data,
* disables all enabled attributes and loses all indices
*
- * @throws GLException is the program is not in use but the shaderProgram is set
- *
* @see #glEnableVertexAttribArray
* @see #glDisableVertexAttribArray
* @see #glVertexAttribPointer
@@ -642,23 +660,23 @@ public class ShaderState {
* @see #glResetAllVertexAttributes
* @see ShaderProgram#glReplaceShader
*/
- public void glReleaseAllVertexAttributes(GL2ES2 gl) {
+ public void releaseAllAttributes(GL2ES2 gl) {
if(null!=shaderProgram) {
- if(!shaderProgram.inUse()) throw new GLException("Program is not in use");
- for(Iterator<GLArrayData> iter = vertexAttribMap2Data.values().iterator(); iter.hasNext(); ) {
- if(!glDisableVertexAttribArray(gl, iter.next())) {
+ for(Iterator<GLArrayData> iter = activeAttribDataMap.values().iterator(); iter.hasNext(); ) {
+ if(!disableVertexAttribArray(gl, iter.next())) {
throw new GLException("Internal Error: mapped vertex attribute couldn't be disabled");
}
}
- for(Iterator iter = enabledVertexAttribArraySet.iterator(); iter.hasNext(); ) {
- if(!glDisableVertexAttribArray(gl, (String) iter.next())) {
+ for(Iterator<String> iter = enabledAttributes.iterator(); iter.hasNext(); ) {
+ if(!disableVertexAttribArray(gl, iter.next())) {
throw new GLException("Internal Error: prev enabled vertex attribute couldn't be disabled");
}
}
}
- vertexAttribMap2Data.clear();
- enabledVertexAttribArraySet.clear();
- attribMap2Location.clear();
+ activeAttribDataMap.clear();
+ enabledAttributes.clear();
+ activeAttribLocationMap.clear();
+ managedAttributes.clear();
}
/**
@@ -669,8 +687,6 @@ public class ShaderState {
*
* This method purpose is more for debugging.
*
- * @throws GLException is the program is not in use but the shaderProgram is set
- *
* @see #glEnableVertexAttribArray
* @see #glDisableVertexAttribArray
* @see #glVertexAttribPointer
@@ -680,62 +696,92 @@ public class ShaderState {
* @see #glResetAllVertexAttributes
* @see ShaderProgram#glReplaceShader
*/
- public void glDisableAllVertexAttributeArrays(GL2ES2 gl, boolean removeFromState) {
- if(!shaderProgram.inUse()) throw new GLException("Program is not in use");
-
- for(Iterator iter = enabledVertexAttribArraySet.iterator(); iter.hasNext(); ) {
- String name = (String) iter.next();
+ public void disableAllVertexAttributeArrays(GL2ES2 gl, boolean removeFromState) {
+ for(Iterator<String> iter = enabledAttributes.iterator(); iter.hasNext(); ) {
+ String name = iter.next();
if(removeFromState) {
- enabledVertexAttribArraySet.remove(name);
+ enabledAttributes.remove(name);
}
- int index = glGetAttribLocation(gl, name);
+ int index = getAttribLocation(gl, name);
if(0<=index) {
gl.glDisableVertexAttribArray(index);
}
}
}
+ private final void relocateAttribute(GL2ES2 gl, GLArrayData attribute) {
+ // get new location ..
+ String name = attribute.getName();
+ int loc = getAttribLocation(gl, name);
+ attribute.setLocation(loc);
+
+ if(0<=loc) {
+ if(enabledAttributes.contains(name)) {
+ // enable attrib, VBO and pass location/data
+ gl.glEnableVertexAttribArray(loc);
+ }
+
+ if( attribute.isVBO() ) {
+ gl.glBindBuffer(GL.GL_ARRAY_BUFFER, attribute.getVBOName());
+ }
+
+ gl.glVertexAttribPointer(attribute);
+ }
+ }
+
/**
* Reset all previously enabled mapped vertex attribute data.
*
- * Attribute data is bound to the GL state<br>
- * Attribute location is bound to the program<br>
+ * <p>Attribute data is bound to the GL state</p>
+ * <p>Attribute location is bound to the program</p>
*
- * However, since binding an attribute to a location via {@link #glBindAttribLocation(GL2ES2, int, GLArrayData)}
+ * <p>However, since binding an attribute to a location via {@link #bindAttribLocation(GL2ES2, int, GLArrayData)}
* <i>must</i> happen before linking <b>and</b> we try to promote the attributes to the new program,
- * we have to gather the probably new location etc.
+ * we have to gather the probably new location etc.</p>
*
- * @throws GLException is the program is not in use
+ * @throws GLException is the program is not linked
*
* @see #attachShaderProgram(GL2ES2, ShaderProgram)
*/
- public void glResetAllVertexAttributes(GL2ES2 gl) {
- if(!shaderProgram.inUse()) throw new GLException("Program is not in use");
- attribMap2Location.clear();
+ private final void resetAllAttributes(GL2ES2 gl) {
+ if(!shaderProgram.linked()) throw new GLException("Program is not linked");
+ activeAttribLocationMap.clear();
- for(Iterator<GLArrayData> iter = vertexAttribMap2Data.values().iterator(); iter.hasNext(); ) {
- GLArrayData data = iter.next();
-
- // get new location ..
- String name = data.getName();
- int loc = glGetAttribLocation(gl, name);
- data.setLocation(loc);
-
- if(0>loc) {
- // not used in shader
- continue;
- }
+ for(Iterator<GLArrayData> iter = managedAttributes.iterator(); iter.hasNext(); ) {
+ iter.next().setLocation(-1);
+ }
+ for(Iterator<GLArrayData> iter = activeAttribDataMap.values().iterator(); iter.hasNext(); ) {
+ relocateAttribute(gl, iter.next());
+ }
+ }
+
+ private final void setAttribute(GL2ES2 gl, GLArrayData attribute) {
+ // get new location ..
+ final String name = attribute.getName();
+ final int loc = attribute.getLocation();
+
+ if(0<=loc) {
+ this.bindAttribLocation(gl, loc, name);
- if(enabledVertexAttribArraySet.contains(name)) {
+ if(enabledAttributes.contains(name)) {
// enable attrib, VBO and pass location/data
gl.glEnableVertexAttribArray(loc);
}
-
- if( data.isVBO() ) {
- gl.glBindBuffer(GL.GL_ARRAY_BUFFER, data.getVBOName());
+
+ if( attribute.isVBO() ) {
+ gl.glBindBuffer(GL.GL_ARRAY_BUFFER, attribute.getVBOName());
}
-
- gl.glVertexAttribPointer(data);
+
+ gl.glVertexAttribPointer(attribute);
+ }
+ }
+
+ /**
+ * preserves the attribute location .. (program not linked)
+ */
+ private final void setAllAttributes(GL2ES2 gl) {
+ for(Iterator<GLArrayData> iter = activeAttribDataMap.values().iterator(); iter.hasNext(); ) {
+ setAttribute(gl, iter.next());
}
}
@@ -744,6 +790,33 @@ public class ShaderState {
//
/**
+ * Bind the {@link GLUniform} lifecycle to this ShaderState.
+ *
+ * <p>If a uniform location is cached it is promoted to the {@link GLUniformData} instance.</p>
+ *
+ * <p>The attribute will be destroyed with {@link #destroy(GL2ES2)}
+ * and it's location will be reset when switching shader with {@link #attachShaderProgram(GL2ES2, ShaderProgram)}.</p>
+ *
+ * <p>The data will not be transfered to the GPU, use {@link #uniform(GL2ES2, GLUniformData)} additionally.</p>
+ *
+ * @param uniform the {@link GLUniformData} which lifecycle shall be managed
+ *
+ * @see #getUniform(String)
+ */
+ public void ownUniform(GLUniformData uniform) {
+ final int location = getUniformLocation(uniform.getName());
+ if(0<=location) {
+ uniform.setLocation(location);
+ }
+ activeUniformDataMap.put(uniform.getName(), uniform);
+ managedUniforms.add(uniform);
+ }
+
+ public boolean ownsUniform(GLUniformData uniform) {
+ return managedUniforms.contains(uniform);
+ }
+
+ /**
* Gets the index of a shader uniform.
* This must be done when the program is in use !
*
@@ -757,14 +830,14 @@ public class ShaderState {
* @see #getUniformLocation
* @see ShaderProgram#glReplaceShader
*/
- protected int glGetUniformLocation(GL2ES2 gl, String name) {
+ protected final int getUniformLocation(GL2ES2 gl, String name) {
if(!shaderProgram.inUse()) throw new GLException("Program is not in use");
int location = getUniformLocation(name);
if(0>location) {
location = gl.glGetUniformLocation(shaderProgram.program(), name);
if(0<=location) {
Integer idx = new Integer(location);
- uniformMap2Location.put(name, idx);
+ activeUniformLocationMap.put(name, idx);
} else if(verbose) {
Throwable tX = new Throwable("Info: glUniform failed, no location for: "+name+", index: "+location);
tX.printStackTrace();
@@ -773,8 +846,8 @@ public class ShaderState {
return location;
}
- protected int getUniformLocation(String name) {
- Integer idx = (Integer) uniformMap2Location.get(name);
+ protected final int getUniformLocation(String name) {
+ Integer idx = (Integer) activeUniformLocationMap.get(name);
return (null!=idx)?idx.intValue():-1;
}
@@ -798,11 +871,14 @@ public class ShaderState {
* @see #getUniformLocation
* @see ShaderProgram#glReplaceShader
*/
- public boolean glUniform(GL2ES2 gl, GLUniformData data) {
+ public boolean uniform(GL2ES2 gl, GLUniformData data) {
if(!shaderProgram.inUse()) throw new GLException("Program is not in use");
- int location = glGetUniformLocation(gl, data.getName());
- data.setLocation(location);
- uniformMap2Data.put(data.getName(), data);
+ int location = data.getLocation();
+ if(0>location) {
+ location = getUniformLocation(gl, data.getName());
+ data.setLocation(location);
+ }
+ activeUniformDataMap.put(data.getName(), data);
if(0<=location) {
// only pass the data, if the uniform exists in the current shader
if(DEBUG) {
@@ -819,18 +895,17 @@ public class ShaderState {
* @return the GLUniformData object, null if not previously set.
*/
public GLUniformData getUniform(String name) {
- return uniformMap2Data.get(name);
+ return activeUniformDataMap.get(name);
}
/**
* Releases all mapped uniform data
* and loses all indices
- *
- * @throws GLException is the program is not in use
*/
- public void glReleaseAllUniforms(GL2ES2 gl) {
- uniformMap2Data.clear();
- uniformMap2Location.clear();
+ public void releaseAllUniforms(GL2ES2 gl) {
+ activeUniformDataMap.clear();
+ activeUniformLocationMap.clear();
+ managedUniforms.clear();
}
/**
@@ -843,11 +918,16 @@ public class ShaderState {
*
* @see #attachShaderProgram(GL2ES2, ShaderProgram)
*/
- public void glResetAllUniforms(GL2ES2 gl) {
- if(!shaderProgram.inUse()) throw new GLException("Program is not in use");
- uniformMap2Location.clear();
- for(Iterator<GLUniformData> iter = uniformMap2Data.values().iterator(); iter.hasNext(); ) {
- glUniform(gl, iter.next());
+ private final void resetAllUniforms(GL2ES2 gl) {
+ if(!shaderProgram.inUse()) throw new GLException("Program is not in use");
+ activeUniformLocationMap.clear();
+ for(Iterator<GLUniformData> iter = managedUniforms.iterator(); iter.hasNext(); ) {
+ iter.next().setLocation(-1);
+ }
+ for(Iterator<GLUniformData> iter = activeUniformDataMap.values().iterator(); iter.hasNext(); ) {
+ final GLUniformData uniform = iter.next();
+ uniform.setLocation(-1);
+ uniform(gl, uniform);
}
}
@@ -858,26 +938,30 @@ public class ShaderState {
sb.append("ShaderState[");
sb.append(shaderProgram.toString());
- sb.append(",EnabledStates: [");
- for(Iterator iter = enabledVertexAttribArraySet.iterator(); iter.hasNext(); ) {
+ sb.append(", enabledAttributes: [");
+ for(Iterator<String> iter = enabledAttributes.iterator(); iter.hasNext(); ) {
sb.append("\n ");
sb.append((String)iter.next());
}
- sb.append("], [");
- for(Iterator<GLArrayData> iter = vertexAttribMap2Data.values().iterator(); iter.hasNext(); ) {
- GLArrayData data = iter.next();
- if(data.getLocation()>=0) {
- sb.append("\n ");
- sb.append(data);
- }
+ sb.append("], activeAttributes [");
+ for(Iterator<GLArrayData> iter = activeAttribDataMap.values().iterator(); iter.hasNext(); ) {
+ sb.append("\n ");
+ sb.append(iter.next());
}
- sb.append("], [");
- for(Iterator<GLUniformData> iter=uniformMap2Data.values().iterator(); iter.hasNext(); ) {
- GLUniformData data = iter.next();
- if(data.getLocation()>=0) {
- sb.append("\n ");
- sb.append(data);
- }
+ sb.append("], managedAttributes [");
+ for(Iterator<GLArrayData> iter = managedAttributes.iterator(); iter.hasNext(); ) {
+ sb.append("\n ");
+ sb.append(iter.next());
+ }
+ sb.append("], activeUniforms [");
+ for(Iterator<GLUniformData> iter=activeUniformDataMap.values().iterator(); iter.hasNext(); ) {
+ sb.append("\n ");
+ sb.append(iter.next());
+ }
+ sb.append("], managedUniforms [");
+ for(Iterator<GLUniformData> iter = managedUniforms.iterator(); iter.hasNext(); ) {
+ sb.append("\n ");
+ sb.append(iter.next());
}
sb.append("]");
return sb;
@@ -888,15 +972,17 @@ public class ShaderState {
return toString(null).toString();
}
- protected boolean verbose = false;
- protected ShaderProgram shaderProgram=null;
+ private boolean verbose = false;
+ private ShaderProgram shaderProgram=null;
- protected HashSet<String> enabledVertexAttribArraySet = new HashSet<String>();
- protected HashMap<String, Integer> attribMap2Location = new HashMap<String, Integer>();
- protected HashMap<String, GLArrayData> vertexAttribMap2Data = new HashMap<String, GLArrayData>();
+ private HashSet<String> enabledAttributes = new HashSet<String>();
+ private HashMap<String, Integer> activeAttribLocationMap = new HashMap<String, Integer>();
+ private HashMap<String, GLArrayData> activeAttribDataMap = new HashMap<String, GLArrayData>();
+ private ArrayList<GLArrayData> managedAttributes = new ArrayList<GLArrayData>();
- protected HashMap<String, Integer> uniformMap2Location = new HashMap<String, Integer>();
- protected HashMap<String, GLUniformData> uniformMap2Data = new HashMap<String, GLUniformData>();
+ private HashMap<String, Integer> activeUniformLocationMap = new HashMap<String, Integer>();
+ private HashMap<String, GLUniformData> activeUniformDataMap = new HashMap<String, GLUniformData>();
+ private ArrayList<GLUniformData> managedUniforms = new ArrayList<GLUniformData>();
private HashMap<String, Object> attachedObjectsByString = new HashMap<String, Object>();
private IntObjectHashMap attachedObjectsByInt = new IntObjectHashMap();
diff --git a/src/jogl/classes/javax/media/opengl/GLArrayData.java b/src/jogl/classes/javax/media/opengl/GLArrayData.java
index f375be623..448ddd10c 100644
--- a/src/jogl/classes/javax/media/opengl/GLArrayData.java
+++ b/src/jogl/classes/javax/media/opengl/GLArrayData.java
@@ -75,7 +75,7 @@ public interface GLArrayData {
* Sets the determined location of the shader attribute
* This is usually done within ShaderState.
*
- * @see com.jogamp.opengl.util.glsl.ShaderState#glVertexAttribPointer(GL2ES2, GLArrayData)
+ * @see com.jogamp.opengl.util.glsl.ShaderState#vertexAttribPointer(GL2ES2, GLArrayData)
*/
public void setLocation(int v);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java b/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java
index 4dcc4560e..0b47606e4 100755
--- a/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java
@@ -62,13 +62,13 @@ public class RegionRendererImpl01 extends RegionRenderer {
sp.init(gl);
st.attachShaderProgram(gl, sp);
- st.glBindAttribLocation(gl, AttributeNames.VERTEX_ATTR_IDX, AttributeNames.VERTEX_ATTR_NAME);
- st.glBindAttribLocation(gl, AttributeNames.TEXCOORD_ATTR_IDX, AttributeNames.TEXCOORD_ATTR_NAME);
+ st.bindAttribLocation(gl, AttributeNames.VERTEX_ATTR_IDX, AttributeNames.VERTEX_ATTR_NAME);
+ st.bindAttribLocation(gl, AttributeNames.TEXCOORD_ATTR_IDX, AttributeNames.TEXCOORD_ATTR_NAME);
if(!sp.link(gl, System.err)) {
throw new GLException("RegionRenderer: Couldn't link program: "+sp);
}
- st.glUseProgram(gl, true);
+ st.useProgram(gl, true);
if(DEBUG) {
System.err.println("RegionRendererImpl01 initialized: " + Thread.currentThread()+" "+st);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java b/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java
index 4c4a325ae..eef64dab5 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java
@@ -29,15 +29,13 @@ package jogamp.graph.curve.opengl;
import java.nio.FloatBuffer;
-import javax.media.opengl.GL;
-import javax.media.opengl.GLProfile;
+import javax.media.opengl.GL2ES2;
import javax.media.opengl.GLUniformData;
import javax.media.opengl.fixedfunc.GLMatrixFunc;
import jogamp.graph.curve.opengl.shader.UniformNames;
import com.jogamp.common.os.Platform;
-import com.jogamp.common.util.VersionUtil;
import com.jogamp.graph.curve.opengl.RenderState;
import com.jogamp.graph.geom.Vertex;
import com.jogamp.opengl.util.PMVMatrix;
@@ -45,22 +43,22 @@ import com.jogamp.opengl.util.glsl.ShaderState;
public class RenderStateImpl implements RenderState {
- public final ShaderState st;
- public final Vertex.Factory<? extends Vertex> pointFactory;
- public final PMVMatrix pmvMatrix;
- public final GLUniformData mgl_PMVMatrix;
+ private final ShaderState st;
+ private final Vertex.Factory<? extends Vertex> pointFactory;
+ private final PMVMatrix pmvMatrix;
+ private final GLUniformData gcu_PMVMatrix;
/**
* Sharpness is equivalent to the texture-coord component <i>t</i>
* on the off-curve vertex. Higher values of sharpness will
* result in higher curvature.
*/
- public final GLUniformData mgl_sharpness;
- public final GLUniformData mgl_alpha;
- public final GLUniformData mgl_colorStatic;
- public final GLUniformData mgl_strength;
+ private final GLUniformData gcu_Sharpness;
+ private final GLUniformData gcu_Alpha;
+ private final GLUniformData gcu_ColorStatic;
+ private final GLUniformData gcu_Strength;
- public static final RenderState getRenderState(GL gl) {
+ public static final RenderState getRenderState(GL2ES2 gl) {
return (RenderState) gl.getContext().getAttachedObject(RenderState.class.getName());
}
@@ -68,12 +66,17 @@ public class RenderStateImpl implements RenderState {
this.st = st;
this.pointFactory = pointFactory;
this.pmvMatrix = pmvMatrix;
- this.mgl_PMVMatrix = new GLUniformData(UniformNames.gcu_PMVMatrix, 4, 4, pmvMatrix.glGetPMvMatrixf());
+ this.gcu_PMVMatrix = new GLUniformData(UniformNames.gcu_PMVMatrix, 4, 4, pmvMatrix.glGetPMvMatrixf());
+ st.ownUniform(gcu_PMVMatrix);
- mgl_sharpness = new GLUniformData(UniformNames.gcu_P1Y, 0.5f);
- mgl_alpha = new GLUniformData(UniformNames.gcu_Alpha, 1.0f);
- mgl_colorStatic = new GLUniformData(UniformNames.gcu_ColorStatic, 3, FloatBuffer.allocate(3));
- mgl_strength = new GLUniformData(UniformNames.gcu_Strength, 3.0f);
+ gcu_Sharpness = new GLUniformData(UniformNames.gcu_P1Y, 0.5f);
+ st.ownUniform(gcu_PMVMatrix);
+ gcu_Alpha = new GLUniformData(UniformNames.gcu_Alpha, 1.0f);
+ st.ownUniform(gcu_Alpha);
+ gcu_ColorStatic = new GLUniformData(UniformNames.gcu_ColorStatic, 3, FloatBuffer.allocate(3));
+ st.ownUniform(gcu_ColorStatic);
+ gcu_Strength = new GLUniformData(UniformNames.gcu_Strength, 3.0f);
+ st.ownUniform(gcu_Strength);
}
public RenderStateImpl(ShaderState st, Vertex.Factory<? extends Vertex> pointFactory) {
@@ -89,17 +92,21 @@ public class RenderStateImpl implements RenderState {
public final ShaderState getShaderState() { return st; }
public final Vertex.Factory<? extends Vertex> getPointFactory () { return pointFactory; }
- public final PMVMatrix getPMVMatrix() { return pmvMatrix; }
- public final GLUniformData getPMVMatrixUniform() { return mgl_PMVMatrix; }
- public final GLUniformData getSharpness() { return mgl_sharpness; }
- public final GLUniformData getAlpha() { return mgl_alpha; }
- public final GLUniformData getColorStatic() { return mgl_colorStatic; }
- public final GLUniformData getStrength() { return mgl_strength; }
+ public final PMVMatrix pmvMatrix() { return pmvMatrix; }
+ public final GLUniformData getPMVMatrix() { return gcu_PMVMatrix; }
+ public final GLUniformData getSharpness() { return gcu_Sharpness; }
+ public final GLUniformData getAlpha() { return gcu_Alpha; }
+ public final GLUniformData getColorStatic() { return gcu_ColorStatic; }
+ public final GLUniformData getStrength() { return gcu_Strength; }
- public final RenderState attachTo(GL gl) {
+ public void destroy(GL2ES2 gl) {
+ st.destroy(gl);
+ }
+
+ public final RenderState attachTo(GL2ES2 gl) {
return (RenderState) gl.getContext().attachObject(RenderState.class.getName(), this);
}
- public final boolean detachFrom(GL gl) {
+ public final boolean detachFrom(GL2ES2 gl) {
RenderState _rs = (RenderState) gl.getContext().getAttachedObject(RenderState.class.getName());
if(_rs == this) {
gl.getContext().detachObject(RenderState.class.getName());
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/TextRendererImpl01.java b/src/jogl/classes/jogamp/graph/curve/opengl/TextRendererImpl01.java
index 3bddaed3b..2255251a7 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/TextRendererImpl01.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/TextRendererImpl01.java
@@ -64,13 +64,13 @@ public class TextRendererImpl01 extends TextRenderer {
sp.init(gl);
st.attachShaderProgram(gl, sp);
- st.glBindAttribLocation(gl, AttributeNames.VERTEX_ATTR_IDX, AttributeNames.VERTEX_ATTR_NAME);
- st.glBindAttribLocation(gl, AttributeNames.TEXCOORD_ATTR_IDX, AttributeNames.TEXCOORD_ATTR_NAME);
+ st.bindAttribLocation(gl, AttributeNames.VERTEX_ATTR_IDX, AttributeNames.VERTEX_ATTR_NAME);
+ st.bindAttribLocation(gl, AttributeNames.TEXCOORD_ATTR_IDX, AttributeNames.TEXCOORD_ATTR_NAME);
if(!sp.link(gl, System.err)) {
throw new GLException("TextRendererImpl01: Couldn't link program: "+sp);
}
- st.glUseProgram(gl, true);
+ st.useProgram(gl, true);
if(DEBUG) {
System.err.println("TextRendererImpl01 initialized: " + Thread.currentThread()+" "+st);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PES2.java
index 181ce77b0..90b3d47cd 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PES2.java
@@ -93,7 +93,7 @@ public class VBORegion2PES2 implements Region {
texCoordFboAttr = GLArrayDataServer.createGLSL(st, AttributeNames.TEXCOORD_ATTR_NAME, 2,
GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW);
- st.bindAttribute(texCoordFboAttr);
+ st.ownAttribute(texCoordFboAttr, true);
texCoordFboAttr.putf(5); texCoordFboAttr.putf(5);
texCoordFboAttr.putf(5); texCoordFboAttr.putf(6);
texCoordFboAttr.putf(6); texCoordFboAttr.putf(6);
@@ -102,7 +102,7 @@ public class VBORegion2PES2 implements Region {
verticeFboAttr = GLArrayDataServer.createGLSL(st, AttributeNames.VERTEX_ATTR_NAME, 3,
GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW);
- st.bindAttribute(verticeFboAttr);
+ st.ownAttribute(verticeFboAttr, true);
box = new AABBox();
@@ -111,11 +111,11 @@ public class VBORegion2PES2 implements Region {
verticeTxtAttr = GLArrayDataServer.createGLSL(st, AttributeNames.VERTEX_ATTR_NAME, 3,
GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW);
- st.bindAttribute(verticeTxtAttr);
+ st.ownAttribute(verticeTxtAttr, true);
texCoordTxtAttr = GLArrayDataServer.createGLSL(st, AttributeNames.TEXCOORD_ATTR_NAME, 2,
GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW);
- st.bindAttribute(texCoordTxtAttr);
+ st.ownAttribute(texCoordTxtAttr, true);
if(DEBUG_INSTANCE) {
System.err.println("VBORegion2PES2 Create: " + this);
@@ -232,7 +232,7 @@ public class VBORegion2PES2 implements Region {
gl.glGetIntegerv(GL.GL_ACTIVE_TEXTURE, currentActiveTextureEngine, 0);
*/
gl.glActiveTexture(activeTexture);
- st.glUniform(gl, mgl_ActiveTexture);
+ st.uniform(gl, mgl_ActiveTexture);
fbo.use(gl);
verticeFboAttr.enableBuffer(gl, true);
@@ -275,14 +275,14 @@ public class VBORegion2PES2 implements Region {
//render texture
gl.glViewport(0, 0, tex_width_c, tex_height_c);
- st.glUniform(gl, mgl_fboPMVMatrix); // use orthogonal matrix
+ st.uniform(gl, mgl_fboPMVMatrix); // use orthogonal matrix
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClear(GL2ES2.GL_COLOR_BUFFER_BIT | GL2ES2.GL_DEPTH_BUFFER_BIT);
renderRegion(gl);
fbo.unbind(gl);
- st.glUniform(gl, rs.getPMVMatrixUniform()); // switch back to real PMV matrix
+ st.uniform(gl, rs.getPMVMatrix()); // switch back to real PMV matrix
}
private void renderRegion(GL2ES2 gl) {
@@ -316,28 +316,22 @@ public class VBORegion2PES2 implements Region {
return dirty;
}
- public void destroy(GL2ES2 gl) {
+ public void destroy(GL2ES2 gl, RenderState rs) {
if(DEBUG_INSTANCE) {
System.err.println("VBORegion2PES2 Destroy: " + this);
}
- destroyFbo(gl);
- destroyTxtAttr(gl);
- destroyFboAttr(gl);
- triangles.clear();
- vertices.clear();
- }
- final void destroyFbo(GL2ES2 gl) {
+ final ShaderState st = rs.getShaderState();
if(null != fbo) {
fbo.destroy(gl);
fbo = null;
}
- }
- final void destroyTxtAttr(GL2ES2 gl) {
if(null != verticeTxtAttr) {
+ st.ownAttribute(verticeTxtAttr, false);
verticeTxtAttr.destroy(gl);
verticeTxtAttr = null;
}
if(null != texCoordTxtAttr) {
+ st.ownAttribute(texCoordTxtAttr, false);
texCoordTxtAttr.destroy(gl);
texCoordTxtAttr = null;
}
@@ -345,13 +339,13 @@ public class VBORegion2PES2 implements Region {
indicesTxt.destroy(gl);
indicesTxt = null;
}
- }
- final void destroyFboAttr(GL2ES2 gl) {
if(null != verticeFboAttr) {
+ st.ownAttribute(verticeFboAttr, false);
verticeFboAttr.destroy(gl);
verticeFboAttr = null;
}
if(null != texCoordFboAttr) {
+ st.ownAttribute(texCoordFboAttr, false);
texCoordFboAttr.destroy(gl);
texCoordFboAttr = null;
}
@@ -359,6 +353,8 @@ public class VBORegion2PES2 implements Region {
indicesFbo.destroy(gl);
indicesFbo = null;
}
+ triangles.clear();
+ vertices.clear();
}
public boolean isFlipped() {
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
index 1b295de16..7956e5137 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
@@ -62,15 +62,15 @@ public class VBORegionSPES2 implements Region {
final int initialSize = 256;
final ShaderState st = rs.getShaderState();
- indices = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, initialSize, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
+ 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);
- st.bindAttribute(verticeAttr);
+ 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);
- st.bindAttribute(texCoordAttr);
+ st.ownAttribute(texCoordAttr, true);
if(DEBUG_INSTANCE) {
System.err.println("VBORegionSPES2 Create: " + this);
@@ -187,15 +187,18 @@ public class VBORegionSPES2 implements Region {
return dirty;
}
- public final void destroy(GL2ES2 gl) {
+ public final void destroy(GL2ES2 gl, RenderState rs) {
if(DEBUG_INSTANCE) {
System.err.println("VBORegionSPES2 Destroy: " + this);
}
+ final ShaderState st = rs.getShaderState();
if(null != verticeAttr) {
+ st.ownAttribute(verticeAttr, false);
verticeAttr.destroy(gl);
verticeAttr = null;
}
if(null != texCoordAttr) {
+ st.ownAttribute(texCoordAttr, false);
texCoordAttr.destroy(gl);
texCoordAttr = null;
}
diff --git a/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java b/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java
index 8f7dcf30a..1faee87ff 100644
--- a/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java
+++ b/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java
@@ -155,9 +155,10 @@ public class GlyphString {
}
/** Destroy the associated OGL objects
+ * @param rs TODO
*/
- public void destroy(GL2ES2 gl){
- region.destroy(gl);
+ public void destroy(GL2ES2 gl, RenderState rs){
+ region.destroy(gl, rs);
}
public AABBox getBounds(){
diff --git a/src/jogl/classes/jogamp/opengl/util/glsl/fixedfunc/FixedFuncPipeline.java b/src/jogl/classes/jogamp/opengl/util/glsl/fixedfunc/FixedFuncPipeline.java
index b77cf4617..fadce2b4d 100644
--- a/src/jogl/classes/jogamp/opengl/util/glsl/fixedfunc/FixedFuncPipeline.java
+++ b/src/jogl/classes/jogamp/opengl/util/glsl/fixedfunc/FixedFuncPipeline.java
@@ -83,9 +83,9 @@ public class FixedFuncPipeline {
}
public void glEnableClientState(GL2ES2 gl, int glArrayIndex) {
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
- shaderState.glEnableVertexAttribArray(gl, getArrayIndexName(glArrayIndex));
+ shaderState.enableVertexAttribArray(gl, getArrayIndexName(glArrayIndex));
// textureCoordsEnabled |= (1 << activeTextureUnit);
if ( textureCoordsEnabled.get(activeTextureUnit) != 1 ) {
textureCoordsEnabled.put(activeTextureUnit, 1);
@@ -94,9 +94,9 @@ public class FixedFuncPipeline {
}
public void glDisableClientState(GL2ES2 gl, int glArrayIndex) {
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
- shaderState.glDisableVertexAttribArray(gl, getArrayIndexName(glArrayIndex));
+ shaderState.disableVertexAttribArray(gl, getArrayIndexName(glArrayIndex));
// textureCoordsEnabled &= ~(1 << activeTextureUnit);
if ( textureCoordsEnabled.get(activeTextureUnit) != 0 ) {
textureCoordsEnabled.put(activeTextureUnit, 0);
@@ -105,37 +105,37 @@ public class FixedFuncPipeline {
}
public void glVertexPointer(GL2ES2 gl, GLArrayData data) {
- shaderState.glUseProgram(gl, true);
- shaderState.glVertexAttribPointer(gl, data);
+ shaderState.useProgram(gl, true);
+ shaderState.vertexAttribPointer(gl, data);
}
public void glColorPointer(GL2ES2 gl, GLArrayData data) {
- shaderState.glUseProgram(gl, true);
- shaderState.glVertexAttribPointer(gl, data);
+ shaderState.useProgram(gl, true);
+ shaderState.vertexAttribPointer(gl, data);
}
public void glColor4fv(GL2ES2 gl, FloatBuffer data ) {
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
GLUniformData ud = shaderState.getUniform(mgl_ColorStatic);
if(null!=ud) {
ud.setData(data);
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
}
public void glNormalPointer(GL2ES2 gl, GLArrayData data) {
- shaderState.glUseProgram(gl, true);
- shaderState.glVertexAttribPointer(gl, data);
+ shaderState.useProgram(gl, true);
+ shaderState.vertexAttribPointer(gl, data);
}
public void glTexCoordPointer(GL2ES2 gl, GLArrayData data) {
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
data.setName( getArrayIndexName(data.getIndex()) );
- shaderState.glVertexAttribPointer(gl, data);
+ shaderState.vertexAttribPointer(gl, data);
}
public void glLightfv(GL2ES2 gl, int light, int pname, java.nio.FloatBuffer params) {
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
light -=GLLightingFunc.GL_LIGHT0;
if(0 <= light && light < MAX_LIGHTS) {
GLUniformData ud = null;
@@ -178,7 +178,7 @@ public class FixedFuncPipeline {
}
if(null!=ud) {
ud.setData(params);
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
} else if(verbose) {
System.err.println("glLightfv light not within [0.."+MAX_LIGHTS+"]: "+light);
@@ -186,7 +186,7 @@ public class FixedFuncPipeline {
}
public void glMaterialfv(GL2ES2 gl, int face, int pname, java.nio.FloatBuffer params) {
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
switch (face) {
case GL.GL_FRONT:
@@ -228,33 +228,33 @@ public class FixedFuncPipeline {
}
if(null!=ud) {
ud.setData(params);
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
}
public void glShadeModel(GL2ES2 gl, int mode) {
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
GLUniformData ud = shaderState.getUniform(mgl_ShadeModel);
if(null!=ud) {
ud.setData(mode);
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
}
public void glActiveTexture(GL2ES2 gl, int textureUnit) {
textureUnit -= GL.GL_TEXTURE0;
if(0 <= textureUnit && textureUnit<MAX_TEXTURE_UNITS) {
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
GLUniformData ud;
ud = shaderState.getUniform(mgl_ActiveTexture);
if(null!=ud) {
ud.setData(textureUnit);
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
ud = shaderState.getUniform(mgl_ActiveTextureIdx);
if(null!=ud) {
ud.setData(textureUnit);
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
activeTextureUnit = textureUnit;
} else {
@@ -310,20 +310,20 @@ public class FixedFuncPipeline {
}
public void validate(GL2ES2 gl) {
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
GLUniformData ud;
if(pmvMatrix.update()) {
ud = shaderState.getUniform(mgl_PMVMatrix);
if(null!=ud) {
// same data object ..
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
} else {
- throw new GLException("Failed to update: mgl_PMVMatrix");
+ throw new GLException("Failed to update: gcu_PMVMatrix");
}
ud = shaderState.getUniform(mgl_NormalMatrix);
if(null!=ud) {
// same data object ..
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
}
ud = shaderState.getUniform(mgl_ColorEnabled);
@@ -331,14 +331,14 @@ public class FixedFuncPipeline {
int ca = (shaderState.isVertexAttribArrayEnabled(mgl_Color)==true)?1:0;
if(ca!=ud.intValue()) {
ud.setData(ca);
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
}
ud = shaderState.getUniform(mgl_CullFace);
if(null!=ud) {
if(cullFace!=ud.intValue()) {
ud.setData(cullFace);
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
}
@@ -346,7 +346,7 @@ public class FixedFuncPipeline {
ud = shaderState.getUniform(mgl_LightsEnabled);
if(null!=ud) {
// same data object
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
lightsEnabledDirty=false;
}
@@ -355,7 +355,7 @@ public class FixedFuncPipeline {
ud = shaderState.getUniform(mgl_TexCoordEnabled);
if(null!=ud) {
// same data object
- shaderState.glUniform(gl, ud);
+ shaderState.uniform(gl, ud);
}
textureCoordsEnabledDirty=false;
}
@@ -447,43 +447,43 @@ public class FixedFuncPipeline {
}
shaderState.attachShaderProgram(gl, shaderProgramColor);
- shaderState.glUseProgram(gl, true);
+ shaderState.useProgram(gl, true);
// mandatory ..
- if(!shaderState.glUniform(gl, new GLUniformData(mgl_PMVMatrix, 4, 4, pmvMatrix.glGetPMvMviMatrixf()))) {
+ if(!shaderState.uniform(gl, new GLUniformData(mgl_PMVMatrix, 4, 4, pmvMatrix.glGetPMvMviMatrixf()))) {
throw new GLException("Error setting PMVMatrix in shader: "+this);
}
// optional parameter ..
- shaderState.glUniform(gl, new GLUniformData(mgl_NormalMatrix, 3, 3, pmvMatrix.glGetNormalMatrixf()));
-
- shaderState.glUniform(gl, new GLUniformData(mgl_ColorEnabled, 0));
- shaderState.glUniform(gl, new GLUniformData(mgl_ColorStatic, 4, zero4f));
- shaderState.glUniform(gl, new GLUniformData(mgl_TexCoordEnabled, 1, textureCoordsEnabled));
- shaderState.glUniform(gl, new GLUniformData(mgl_ActiveTexture, activeTextureUnit));
- shaderState.glUniform(gl, new GLUniformData(mgl_ActiveTextureIdx, activeTextureUnit));
- shaderState.glUniform(gl, new GLUniformData(mgl_ShadeModel, 0));
- shaderState.glUniform(gl, new GLUniformData(mgl_CullFace, cullFace));
+ shaderState.uniform(gl, new GLUniformData(mgl_NormalMatrix, 3, 3, pmvMatrix.glGetNormalMatrixf()));
+
+ shaderState.uniform(gl, new GLUniformData(mgl_ColorEnabled, 0));
+ shaderState.uniform(gl, new GLUniformData(mgl_ColorStatic, 4, zero4f));
+ shaderState.uniform(gl, new GLUniformData(mgl_TexCoordEnabled, 1, textureCoordsEnabled));
+ shaderState.uniform(gl, new GLUniformData(mgl_ActiveTexture, activeTextureUnit));
+ shaderState.uniform(gl, new GLUniformData(mgl_ActiveTextureIdx, activeTextureUnit));
+ shaderState.uniform(gl, new GLUniformData(mgl_ShadeModel, 0));
+ shaderState.uniform(gl, new GLUniformData(mgl_CullFace, cullFace));
for(int i=0; i<MAX_LIGHTS; i++) {
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].ambient", 4, defAmbient));
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].diffuse", 4, defDiffuse));
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].specular", 4, defSpecular));
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].position", 4, defPosition));
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].spotDirection", 3, defSpotDir));
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].spotExponent", defSpotExponent));
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].spotCutoff", defSpotCutoff));
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].constantAttenuation", defConstantAtten));
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].linearAttenuation", defLinearAtten));
- shaderState.glUniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].quadraticAttenuation", defQuadraticAtten));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].ambient", 4, defAmbient));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].diffuse", 4, defDiffuse));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].specular", 4, defSpecular));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].position", 4, defPosition));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].spotDirection", 3, defSpotDir));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].spotExponent", defSpotExponent));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].spotCutoff", defSpotCutoff));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].constantAttenuation", defConstantAtten));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].linearAttenuation", defLinearAtten));
+ shaderState.uniform(gl, new GLUniformData(mgl_LightSource+"["+i+"].quadraticAttenuation", defQuadraticAtten));
}
- shaderState.glUniform(gl, new GLUniformData(mgl_LightsEnabled, 1, lightsEnabled));
- shaderState.glUniform(gl, new GLUniformData(mgl_FrontMaterial+".ambient", 4, defMatAmbient));
- shaderState.glUniform(gl, new GLUniformData(mgl_FrontMaterial+".diffuse", 4, defMatDiffuse));
- shaderState.glUniform(gl, new GLUniformData(mgl_FrontMaterial+".specular", 4, defMatSpecular));
- shaderState.glUniform(gl, new GLUniformData(mgl_FrontMaterial+".emission", 4, defMatEmission));
- shaderState.glUniform(gl, new GLUniformData(mgl_FrontMaterial+".shininess", defMatShininess));
-
- shaderState.glUseProgram(gl, false);
+ shaderState.uniform(gl, new GLUniformData(mgl_LightsEnabled, 1, lightsEnabled));
+ shaderState.uniform(gl, new GLUniformData(mgl_FrontMaterial+".ambient", 4, defMatAmbient));
+ shaderState.uniform(gl, new GLUniformData(mgl_FrontMaterial+".diffuse", 4, defMatDiffuse));
+ shaderState.uniform(gl, new GLUniformData(mgl_FrontMaterial+".specular", 4, defMatSpecular));
+ shaderState.uniform(gl, new GLUniformData(mgl_FrontMaterial+".emission", 4, defMatEmission));
+ shaderState.uniform(gl, new GLUniformData(mgl_FrontMaterial+".shininess", defMatShininess));
+
+ shaderState.useProgram(gl, false);
}
protected static final boolean DEBUG=false;
@@ -508,7 +508,7 @@ public class FixedFuncPipeline {
protected ShaderProgram shaderProgramColorTextureLight;
// uniforms ..
- protected static final String mgl_PMVMatrix = "mgl_PMVMatrix"; // m4fv[3]
+ protected static final String mgl_PMVMatrix = "gcu_PMVMatrix"; // m4fv[3]
protected static final String mgl_NormalMatrix = "mgl_NormalMatrix"; // m4fv
protected static final String mgl_ColorEnabled = "mgl_ColorEnabled"; // 1i
protected static final String mgl_ColorStatic = "mgl_ColorStatic"; // 4fv
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java
index 8a16113f5..3daa97ab3 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java
@@ -126,7 +126,7 @@ public abstract class GPURendererListenerBase01 implements GLEventListener {
autoDrawable = null;
GL2ES2 gl = drawable.getGL().getGL2ES2();
screenshot.dispose(gl);
- renderer.dispose(gl);
+ renderer.destroy(gl);
}
public void zoom(int v){
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java
index 9ad036d96..e9e5bc105 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java
@@ -104,7 +104,7 @@ public class UIGLListener01 extends UIListenerBase01 {
public void dispose(GLAutoDrawable drawable) {
GL2ES2 gl = drawable.getGL().getGL2ES2();
+ glyphString.destroy(gl, getRegionRenderer().getRenderState());
super.dispose(drawable);
- glyphString.destroy(gl);
}
}
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java
index c74d11f0d..98a7d4531 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java
@@ -130,8 +130,8 @@ public abstract class UIListenerBase01 implements GLEventListener {
autoDrawable = null;
GL2ES2 gl = drawable.getGL().getGL2ES2();
screenshot.dispose(gl);
- rRenderer.dispose(gl);
- tRenderer.dispose(gl);
+ rRenderer.destroy(gl);
+ tRenderer.destroy(gl);
}
public void zoom(int v){
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 ebe24cb00..e75bd7bdd 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
@@ -110,8 +110,8 @@ public class GLSLMiscHelper {
Assert.assertEquals(data, st.getAttribute(data.getName()));
if(st.shaderProgram().linked()) {
Assert.assertEquals(data.getLocation(), st.getAttribLocation(data.getName()));
- Assert.assertEquals(data.getLocation(), st.glGetAttribLocation(gl, data));
- Assert.assertEquals(data.getLocation(), st.glGetAttribLocation(gl, data.getName()));
+ Assert.assertEquals(data.getLocation(), st.getAttribLocation(gl, data));
+ Assert.assertEquals(data.getLocation(), st.getAttribLocation(gl, data.getName()));
Assert.assertEquals(data.getLocation(), gl.glGetAttribLocation(st.shaderProgram().program(), data.getName()));
}
}
@@ -178,7 +178,7 @@ public class GLSLMiscHelper {
// Allocate Vertex Array0
GLArrayDataServer vertices0 = GLArrayDataServer.createGLSL(st, "mgl_Vertex", 3, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW);
if(0<=location) {
- st.glBindAttribLocation(gl, location, vertices0);
+ st.bindAttribLocation(gl, location, vertices0);
}
Assert.assertTrue(vertices0.isVBO());
Assert.assertTrue(vertices0.isVertexAttribute());
@@ -221,7 +221,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);
if(0<=location) {
- st.glBindAttribLocation(gl, location, colors0);
+ st.bindAttribLocation(gl, location, colors0);
}
colors0.putf(1); colors0.putf(0); colors0.putf(0); colors0.putf(1);
colors0.putf(0); colors0.putf(0); colors0.putf(1); colors0.putf(1);
diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState01NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState01NEWT.java
index f357113d3..9bce30285 100644
--- a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState01NEWT.java
+++ b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState01NEWT.java
@@ -91,12 +91,14 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
System.err.println("vertices0: " + vertices0);
vertices0.enableBuffer(gl, false);
Assert.assertEquals(vertices0_loc, vertices0.getLocation());
+ st.ownAttribute(vertices0, true);
// Allocate Color Array0
GLArrayDataServer colors0 = GLSLMiscHelper.createRSColors0(gl, st, colors0_loc);
System.err.println("colors0: " + colors0);
colors0.enableBuffer(gl, false);
Assert.assertEquals(colors0_loc, colors0.getLocation());
+ st.ownAttribute(colors0, true);
Assert.assertTrue(sp.link(gl, System.err));
Assert.assertTrue(sp.linked());
@@ -109,31 +111,34 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
GLSLMiscHelper.validateGLArrayDataServerState(gl, st, colors0);
Assert.assertEquals(null, ShaderState.getShaderState(gl));
- st.glUseProgram(gl, true);
+ st.useProgram(gl, true);
Assert.assertTrue(sp.inUse());
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
Assert.assertEquals(st, ShaderState.getShaderState(gl));
- // setup mgl_PMVMatrix
+ // setup gcu_PMVMatrix
PMVMatrix pmvMatrix = new PMVMatrix();
- GLUniformData pmvMatrixUniform = new GLUniformData("mgl_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
+ GLUniformData pmvMatrixUniform = new GLUniformData("gcu_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
+ st.ownUniform(pmvMatrixUniform);
- st.glUniform(gl, pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
- Assert.assertEquals(pmvMatrixUniform, st.getUniform("mgl_PMVMatrix"));
+ Assert.assertEquals(pmvMatrixUniform, st.getUniform("gcu_PMVMatrix"));
// Allocate Vertex Array1
GLArrayDataServer vertices1 = GLSLMiscHelper.createRSVertices1(gl, st);
System.err.println("vertices1: " + vertices1);
vertices1.enableBuffer(gl, false);
GLSLMiscHelper.validateGLArrayDataServerState(gl, st, vertices1);
+ st.ownAttribute(vertices1, true);
// Allocate Color Array1
GLArrayDataServer colors1 = GLSLMiscHelper.createRSColors1(gl, st);
System.err.println("colors1: " + colors1);
colors1.enableBuffer(gl, false);
GLSLMiscHelper.validateGLArrayDataServerState(gl, st, colors1);
+ st.ownAttribute(colors0, true);
// misc GL setup
gl.glClearColor(0, 0, 0, 1);
@@ -147,7 +152,7 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
pmvMatrix.glMatrixMode(PMVMatrix.GL_MODELVIEW);
pmvMatrix.glLoadIdentity();
pmvMatrix.glTranslatef(0, 0, -10);
- st.glUniform(gl, pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
// display #1 vertices0 / colors0 (post-disable)
@@ -160,12 +165,7 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
GLSLMiscHelper.displayVCArrays(drawable, gl, st, true, vertices0, colors0, true, 3, durationPerTest);
// cleanup
- vertices1.destroy(gl);
- vertices0.destroy(gl);
- colors0.destroy(gl);
- colors1.destroy(gl);
- st.glUseProgram(gl, false);
- sp.release(gl, true);
+ st.destroy(gl);
GLSLMiscHelper.destroyWindow(winctx);
}
@@ -203,19 +203,22 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
Assert.assertTrue(sp.link(gl, System.err));
st.attachShaderProgram(gl, sp);
- st.glUseProgram(gl, true);
+ st.useProgram(gl, true);
- // setup mgl_PMVMatrix
+ // setup gcu_PMVMatrix
PMVMatrix pmvMatrix = new PMVMatrix();
- GLUniformData pmvMatrixUniform = new GLUniformData("mgl_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
- st.glUniform(gl, pmvMatrixUniform);
+ GLUniformData pmvMatrixUniform = new GLUniformData("gcu_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
+ st.ownUniform(pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
// Allocate Vertex Array0
GLArrayDataServer vertices0 = GLSLMiscHelper.createRSVertices0(gl, st, -1);
+ st.ownAttribute(vertices0, true);
vertices0.enableBuffer(gl, toggleEnable ? false : true);
// Allocate Color Array0
GLArrayDataServer colors0 = GLSLMiscHelper.createRSColors0(gl, st, -1);
+ st.ownAttribute(colors0, true);
colors0.enableBuffer(gl, toggleEnable ? false : true);
// misc GL setup
@@ -229,7 +232,7 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
pmvMatrix.glMatrixMode(PMVMatrix.GL_MODELVIEW);
pmvMatrix.glLoadIdentity();
pmvMatrix.glTranslatef(0, 0, -10);
- st.glUniform(gl, pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
long t0 = System.currentTimeMillis();
int frames;
@@ -253,10 +256,7 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
System.err.println("testShaderState00PerformanceSingle toggleEnable "+toggleEnable+": "+dt/1000.0 +"s: "+ frames + "f, " + fpsS.substring(0, fpsSp+2) + " fps, "+dt/frames+" ms/f");
// cleanup
- st.glUseProgram(gl, false);
- sp.release(gl, true);
- vertices0.destroy(gl);
- colors0.destroy(gl);
+ st.destroy(gl);
GLSLMiscHelper.destroyWindow(winctx);
}
@@ -286,27 +286,32 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
Assert.assertTrue(sp.link(gl, System.err));
st.attachShaderProgram(gl, sp);
- st.glUseProgram(gl, true);
+ st.useProgram(gl, true);
- // setup mgl_PMVMatrix
+ // setup gcu_PMVMatrix
PMVMatrix pmvMatrix = new PMVMatrix();
- GLUniformData pmvMatrixUniform = new GLUniformData("mgl_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
- st.glUniform(gl, pmvMatrixUniform);
+ GLUniformData pmvMatrixUniform = new GLUniformData("gcu_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
+ st.ownUniform(pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
// Allocate Vertex Array0
- GLArrayDataServer vertices0 = GLSLMiscHelper.createRSVertices0(gl, st, -1);
+ GLArrayDataServer vertices0 = GLSLMiscHelper.createRSVertices0(gl, st, -1);
+ st.ownAttribute(vertices0, true);
vertices0.enableBuffer(gl, false);
// Allocate Vertex Array1
- GLArrayDataServer vertices1 = GLSLMiscHelper.createRSVertices1(gl, st);
+ GLArrayDataServer vertices1 = GLSLMiscHelper.createRSVertices1(gl, st);
+ st.ownAttribute(vertices1, true);
vertices1.enableBuffer(gl, false);
// Allocate Color Array0
GLArrayDataServer colors0 = GLSLMiscHelper.createRSColors0(gl, st, -1);
+ st.ownAttribute(colors0, true);
colors0.enableBuffer(gl, false);
// Allocate Color Array1
GLArrayDataServer colors1 = GLSLMiscHelper.createRSColors1(gl, st);
+ st.ownAttribute(colors1, true);
colors1.enableBuffer(gl, false);
// misc GL setup
@@ -320,7 +325,7 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
pmvMatrix.glMatrixMode(PMVMatrix.GL_MODELVIEW);
pmvMatrix.glLoadIdentity();
pmvMatrix.glTranslatef(0, 0, -10);
- st.glUniform(gl, pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
// validation ..
GLSLMiscHelper.displayVCArrays(drawable, gl, st, true, vertices0, colors0, true, 1, 0);
@@ -346,12 +351,7 @@ public class TestGLSLShaderState01NEWT extends UITestCase {
System.err.println("testShaderState01PerformanceDouble: "+dt/1000.0 +"s: "+ frames + "f, " + fpsS.substring(0, fpsSp+2) + " fps, "+dt/frames+" ms/f");
// cleanup
- st.glUseProgram(gl, false);
- sp.release(gl, true);
- vertices1.destroy(gl);
- vertices0.destroy(gl);
- colors0.destroy(gl);
- colors1.destroy(gl);
+ st.destroy(gl);
GLSLMiscHelper.destroyWindow(winctx);
}
diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState02NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState02NEWT.java
index 10e506693..7e8fb7c3d 100644
--- a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState02NEWT.java
+++ b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLShaderState02NEWT.java
@@ -57,10 +57,18 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
static long durationPerTest = 10; // ms
static final int vertices0_loc = 0; // FIXME: AMD needs this to be location 0 ? hu ?
- static final int colors0_loc = 2;
+ static final int colors0_loc = 5;
@Test
- public void testShaderState01Validation() throws InterruptedException {
+ public void testShaderState01ValidationSP1Linked() throws InterruptedException {
+ testShaderState01Validation(true);
+ }
+ @Test
+ public void testShaderState01ValidationSP1Unlinked() throws InterruptedException {
+ testShaderState01Validation(false);
+ }
+
+ private void testShaderState01Validation(boolean linkSP1) throws InterruptedException {
// preset ..
GLSLMiscHelper.WindowContext winctx = GLSLMiscHelper.createWindow(GLProfile.getGL2ES2(), true);
GLDrawable drawable = winctx.context.getGLDrawable();
@@ -88,9 +96,11 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
Assert.assertTrue(!sp1.inUse());
Assert.assertTrue(!sp1.linked());
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
- Assert.assertTrue(sp1.link(gl, System.err));
- Assert.assertTrue(sp1.linked());
- Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
+ if(linkSP1) {
+ Assert.assertTrue(sp1.link(gl, System.err));
+ Assert.assertTrue(sp1.linked());
+ Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
+ }
ShaderProgram sp0 = new ShaderProgram();
sp0.add(rsVp0);
@@ -108,12 +118,14 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
// Allocate Vertex Array0
GLArrayDataServer vertices0 = GLSLMiscHelper.createRSVertices0(gl, st, vertices0_loc);
+ st.ownAttribute(vertices0, true);
System.err.println("vertices0: " + vertices0);
vertices0.enableBuffer(gl, false);
Assert.assertEquals(vertices0_loc, vertices0.getLocation());
// Allocate Color Array0
GLArrayDataServer colors0 = GLSLMiscHelper.createRSColors0(gl, st, colors0_loc);
+ st.ownAttribute(colors0, true);
System.err.println("colors0: " + colors0);
colors0.enableBuffer(gl, false);
Assert.assertEquals(colors0_loc, colors0.getLocation());
@@ -123,35 +135,38 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
Assert.assertEquals(vertices0_loc, vertices0.getLocation());
- Assert.assertEquals(vertices0_loc, st.glGetAttribLocation(gl, vertices0.getName()));
+ Assert.assertEquals(vertices0_loc, st.getAttribLocation(gl, vertices0.getName()));
Assert.assertEquals(vertices0_loc, gl.glGetAttribLocation(st.shaderProgram().program(), vertices0.getName()));
Assert.assertEquals(colors0_loc, colors0.getLocation());
- Assert.assertEquals(colors0_loc, st.glGetAttribLocation(gl, colors0.getName()));
+ Assert.assertEquals(colors0_loc, st.getAttribLocation(gl, colors0.getName()));
Assert.assertEquals(colors0_loc, gl.glGetAttribLocation(st.shaderProgram().program(), colors0.getName()));
Assert.assertEquals(null, ShaderState.getShaderState(gl));
- st.glUseProgram(gl, true);
+ st.useProgram(gl, true);
Assert.assertTrue(sp0.inUse());
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
Assert.assertEquals(st, ShaderState.getShaderState(gl));
- // setup mgl_PMVMatrix
+ // setup gcu_PMVMatrix
PMVMatrix pmvMatrix = new PMVMatrix();
- GLUniformData pmvMatrixUniform = new GLUniformData("mgl_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
+ GLUniformData pmvMatrixUniform = new GLUniformData("gcu_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
+ st.ownUniform(pmvMatrixUniform);
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
- st.glUniform(gl, pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
- Assert.assertEquals(pmvMatrixUniform, st.getUniform("mgl_PMVMatrix"));
+ Assert.assertEquals(pmvMatrixUniform, st.getUniform("gcu_PMVMatrix"));
// Allocate Vertex Array1
GLArrayDataServer vertices1 = GLSLMiscHelper.createRSVertices1(gl, st);
+ st.ownAttribute(vertices1, true);
System.err.println("vertices1: " + vertices1);
vertices1.enableBuffer(gl, false);
// Allocate Color Array1
GLArrayDataServer colors1 = GLSLMiscHelper.createRSColors1(gl, st);
+ st.ownAttribute(colors1, true);
System.err.println("colors1: " + colors1);
colors1.enableBuffer(gl, false);
@@ -167,7 +182,7 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
pmvMatrix.glMatrixMode(PMVMatrix.GL_MODELVIEW);
pmvMatrix.glLoadIdentity();
pmvMatrix.glTranslatef(0, 0, -10);
- st.glUniform(gl, pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
// display #1 vertices0 / colors0 (post-disable)
@@ -180,14 +195,19 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
GLSLMiscHelper.displayVCArrays(drawable, gl, st, true, vertices0, colors0, true, 3, durationPerTest);
// SP1
- // both are currently not attached to ShaderState, hence we have to reset their location as well
- vertices0.setLocation(-1);
- colors0.setLocation(-1);
- vertices1.setLocation(-1);
- colors1.setLocation(-1);
-
st.attachShaderProgram(gl, sp1);
+ if(!linkSP1) {
+ // all attribute locations shall be same now, due to impl. glBindAttributeLocation
+ Assert.assertEquals(vertices0_loc, vertices0.getLocation());
+ Assert.assertEquals(vertices0_loc, st.getAttribLocation(gl, vertices0.getName()));
+ Assert.assertEquals(vertices0_loc, gl.glGetAttribLocation(st.shaderProgram().program(), vertices0.getName()));
+
+ Assert.assertEquals(colors0_loc, colors0.getLocation());
+ Assert.assertEquals(colors0_loc, st.getAttribLocation(gl, colors0.getName()));
+ Assert.assertEquals(colors0_loc, gl.glGetAttribLocation(st.shaderProgram().program(), colors0.getName()));
+ }
+
// display #1 vertices0 / colors0 (post-disable)
GLSLMiscHelper.displayVCArrays(drawable, gl, st, true, vertices0, colors0, true, 10, durationPerTest);
@@ -198,12 +218,7 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
GLSLMiscHelper.displayVCArrays(drawable, gl, st, true, vertices0, colors0, true, 30, durationPerTest);
// cleanup
- vertices1.destroy(gl);
- vertices0.destroy(gl);
- colors0.destroy(gl);
- colors1.destroy(gl);
- st.glUseProgram(gl, false);
- sp0.release(gl, true);
+ st.destroy(gl);
GLSLMiscHelper.destroyWindow(winctx);
}
@@ -243,27 +258,32 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
Assert.assertTrue(sp0.link(gl, System.err));
st.attachShaderProgram(gl, sp0);
- st.glUseProgram(gl, true);
+ st.useProgram(gl, true);
- // setup mgl_PMVMatrix
+ // setup gcu_PMVMatrix
PMVMatrix pmvMatrix = new PMVMatrix();
- GLUniformData pmvMatrixUniform = new GLUniformData("mgl_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
- st.glUniform(gl, pmvMatrixUniform);
+ GLUniformData pmvMatrixUniform = new GLUniformData("gcu_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf());
+ st.ownUniform(pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
// Allocate Vertex Array0
- GLArrayDataServer vertices0 = GLSLMiscHelper.createRSVertices0(gl, st, -1);
+ GLArrayDataServer vertices0 = GLSLMiscHelper.createRSVertices0(gl, st, -1);
+ st.ownAttribute(vertices0, true);
vertices0.enableBuffer(gl, false);
// Allocate Vertex Array1
- GLArrayDataServer vertices1 = GLSLMiscHelper.createRSVertices1(gl, st);
+ GLArrayDataServer vertices1 = GLSLMiscHelper.createRSVertices1(gl, st);
+ st.ownAttribute(vertices1, true);
vertices1.enableBuffer(gl, false);
// Allocate Color Array0
GLArrayDataServer colors0 = GLSLMiscHelper.createRSColors0(gl, st, -1);
+ st.ownAttribute(colors0, true);
colors0.enableBuffer(gl, false);
// Allocate Color Array1
GLArrayDataServer colors1 = GLSLMiscHelper.createRSColors1(gl, st);
+ st.ownAttribute(colors1, true);
colors1.enableBuffer(gl, false);
// misc GL setup
@@ -277,9 +297,13 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
pmvMatrix.glMatrixMode(PMVMatrix.GL_MODELVIEW);
pmvMatrix.glLoadIdentity();
pmvMatrix.glTranslatef(0, 0, -10);
- st.glUniform(gl, pmvMatrixUniform);
+ st.uniform(gl, pmvMatrixUniform);
// validation ..
+ st.attachShaderProgram(gl, sp0);
+ GLSLMiscHelper.displayVCArrays(drawable, gl, st, true, vertices0, colors0, true, 1, 0);
+ GLSLMiscHelper.displayVCArrays(drawable, gl, st, true, vertices1, colors1, true, 2, 0);
+ st.attachShaderProgram(gl, sp1);
GLSLMiscHelper.displayVCArrays(drawable, gl, st, true, vertices0, colors0, true, 1, 0);
GLSLMiscHelper.displayVCArrays(drawable, gl, st, true, vertices1, colors1, true, 2, 0);
@@ -288,36 +312,19 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
// warmup ..
for(frames=0; frames<GLSLMiscHelper.frames_warmup; frames+=2) {
// SP0
- vertices0.setLocation(-1);
- colors0.setLocation(-1);
- vertices1.setLocation(-1);
- colors1.setLocation(-1);
st.attachShaderProgram(gl, sp0);
GLSLMiscHelper.displayVCArraysNoChecks(drawable, gl, true, vertices0, colors0, true);
// SP1
- vertices0.setLocation(-1);
- colors0.setLocation(-1);
- vertices1.setLocation(-1);
- colors1.setLocation(-1);
st.attachShaderProgram(gl, sp1);
GLSLMiscHelper.displayVCArraysNoChecks(drawable, gl, true, vertices1, colors1, true);
}
// measure ..
for(frames=0; frames<GLSLMiscHelper.frames_perftest; frames+=4) {
// SP0
- vertices0.setLocation(-1);
- colors0.setLocation(-1);
- vertices1.setLocation(-1);
- colors1.setLocation(-1);
st.attachShaderProgram(gl, sp0);
GLSLMiscHelper.displayVCArraysNoChecks(drawable, gl, true, vertices0, colors0, true);
- GLSLMiscHelper.displayVCArraysNoChecks(drawable, gl, true, vertices1, colors1, true);
-
+ GLSLMiscHelper.displayVCArraysNoChecks(drawable, gl, true, vertices1, colors1, true);
// SP1
- vertices0.setLocation(-1);
- colors0.setLocation(-1);
- vertices1.setLocation(-1);
- colors1.setLocation(-1);
st.attachShaderProgram(gl, sp1);
GLSLMiscHelper.displayVCArraysNoChecks(drawable, gl, true, vertices0, colors0, true);
GLSLMiscHelper.displayVCArraysNoChecks(drawable, gl, true, vertices1, colors1, true);
@@ -331,13 +338,7 @@ public class TestGLSLShaderState02NEWT extends UITestCase {
System.err.println("testShaderState01PerformanceDouble: "+dt/1000.0 +"s: "+ frames + "f, " + fpsS.substring(0, fpsSp+2) + " fps, "+dt/frames+" ms/f");
// cleanup
- st.glUseProgram(gl, false);
- sp0.release(gl, true);
- vertices1.destroy(gl);
- vertices0.destroy(gl);
- colors0.destroy(gl);
- colors1.destroy(gl);
-
+ st.destroy(gl);
GLSLMiscHelper.destroyWindow(winctx);
}
diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLSimple01NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLSimple01NEWT.java
index 086c0d111..ed9fbd455 100644
--- a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLSimple01NEWT.java
+++ b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestGLSLSimple01NEWT.java
@@ -118,7 +118,7 @@ public class TestGLSLSimple01NEWT extends UITestCase {
window.addGLEventListener(new RedSquare0());
Animator animator = new Animator(window);
- animator.setUpdateFPSFrames(1, System.err);
+ animator.setUpdateFPSFrames(1, null);
animator.start();
Assert.assertEquals(true, animator.isAnimating());
while(animator.isAnimating() && animator.getTotalFPSDuration()<durationPerTest) {