destroyShaderCode
is true it destroys the shader codes as well.
*/
public synchronized void release(final GL2ES2 gl, final boolean destroyShaderCode) {
if( programLinked ) {
useProgram(gl, false);
}
for(final IteratorThis command does not compile and attach the shader, * use {@link #add(GL2ES2, ShaderCode)} for this purpose.
*/ public synchronized void add(final ShaderCode shaderCode) throws GLException { allShaderCode.add(shaderCode); } public synchronized boolean contains(final ShaderCode shaderCode) { return allShaderCode.contains(shaderCode); } /** * Warning slow O(n) operation .. * @param id * @return */ public synchronized ShaderCode getShader(final int id) { for(final IteratorCompiles and attaches the shader, if not done yet.
* * @return true if the shader was successfully added, false if compilation failed. */ public synchronized boolean add(final GL2ES2 gl, final ShaderCode shaderCode, final PrintStream verboseOut) { if( !init(gl) ) { return false; } if( allShaderCode.add(shaderCode) ) { if( !shaderCode.compile(gl, verboseOut) ) { return false; } if( attachedShaderCode.add(shaderCode) ) { ShaderUtil.attachShader(gl, shaderProgram, shaderCode.shader()); } } return true; } /** * Replace a shader in a program and re-links the program. * * @param gl * @param oldShader the to be replace Shader * @param newShader the new ShaderCode * @param verboseOut the optional verbose output stream * * @return true if all steps are valid, shader compilation, attachment and linking; otherwise false. * * @see ShaderState#glEnableVertexAttribArray * @see ShaderState#glDisableVertexAttribArray * @see ShaderState#glVertexAttribPointer * @see ShaderState#getVertexAttribPointer * @see ShaderState#glReleaseAllVertexAttributes * @see ShaderState#glResetAllVertexAttributes * @see ShaderState#glResetAllVertexAttributes * @see ShaderState#glResetAllVertexAttributes */ public synchronized boolean replaceShader(final GL2ES2 gl, final ShaderCode oldShader, final ShaderCode newShader, final PrintStream verboseOut) { if(!init(gl) || !newShader.compile(gl, verboseOut)) { return false; } final boolean shaderWasInUse = inUse(); if(shaderWasInUse) { useProgram(gl, false); } if(null != oldShader && allShaderCode.remove(oldShader)) { if(attachedShaderCode.remove(oldShader)) { ShaderUtil.detachShader(gl, shaderProgram, oldShader.shader()); } } add(newShader); if(attachedShaderCode.add(newShader)) { ShaderUtil.attachShader(gl, shaderProgram, newShader.shader()); } gl.glLinkProgram(shaderProgram); programLinked = ShaderUtil.isProgramLinkStatusValid(gl, shaderProgram, verboseOut); if ( programLinked && shaderWasInUse ) { useProgram(gl, true); } return programLinked; } /** * Links the shader code to the program. * *Compiles and attaches the shader code to the program if not done by yet
* *Within this process, all GL resources (shader and program objects) are created if necessary.
* * @param gl * @param verboseOut * @return true if program was successfully linked and is valid, otherwise false * * @see #init(GL2ES2) */ public synchronized boolean link(final GL2ES2 gl, final PrintStream verboseOut) { if( !init(gl) ) { programLinked = false; // mark unlinked due to user attempt to [re]link return false; } for(final Iterator