29package com.jogamp.opengl.util.glsl;
31import com.jogamp.opengl.*;
33import com.jogamp.common.os.Platform;
35import java.util.HashSet;
36import java.util.Iterator;
37import java.io.PrintStream;
54 public int program() {
return shaderProgram; }
59 public int id() {
return id; }
87 public synchronized void release(
final GL2ES2 gl,
final boolean destroyShaderCode) {
91 for(
final Iterator<ShaderCode> iter=allShaderCode.iterator(); iter.hasNext(); ) {
93 if(attachedShaderCode.remove(shaderCode)) {
96 if(destroyShaderCode) {
100 allShaderCode.clear();
101 attachedShaderCode.clear();
102 if( 0 != shaderProgram ) {
120 allShaderCode.add(shaderCode);
124 return allShaderCode.contains(shaderCode);
133 for(
final Iterator<ShaderCode> iter=allShaderCode.iterator(); iter.hasNext(); ) {
135 if(shaderCode.id() ==
id) {
154 if( 0 == shaderProgram ) {
157 return 0 != shaderProgram;
167 public synchronized boolean add(
final GL2ES2 gl,
final ShaderCode shaderCode,
final PrintStream verboseOut) {
168 if( !
init(gl) ) {
return false; }
169 if( allShaderCode.add(shaderCode) ) {
170 if( !shaderCode.
compile(gl, verboseOut) ) {
173 if( attachedShaderCode.add(shaderCode) ) {
200 if(!
init(gl) || !newShader.
compile(gl, verboseOut)) {
204 final boolean shaderWasInUse =
inUse();
209 if(
null != oldShader && allShaderCode.remove(oldShader)) {
210 if(attachedShaderCode.remove(oldShader)) {
216 if(attachedShaderCode.add(newShader)) {
223 if ( programLinked && shaderWasInUse ) {
226 return programLinked;
242 public synchronized boolean link(
final GL2ES2 gl,
final PrintStream verboseOut) {
244 programLinked =
false;
248 for(
final Iterator<ShaderCode> iter=allShaderCode.iterator(); iter.hasNext(); ) {
250 if(!shaderCode.
compile(gl, verboseOut)) {
251 programLinked =
false;
254 if(attachedShaderCode.add(shaderCode)) {
264 return programLinked;
268 public boolean equals(
final Object obj) {
269 if(
this == obj) {
return true; }
283 sb =
new StringBuilder();
285 sb.append(
"ShaderProgram[id=").append(
id);
286 sb.append(
", linked="+programLinked+
", inUse="+programInUse+
", program: "+shaderProgram+
", "+allShaderCode.size()+
" code: ");
287 if( 0 < allShaderCode.size() ) {
288 for(
final Iterator<ShaderCode> iter=allShaderCode.iterator(); iter.hasNext(); ) {
289 sb.append(Platform.getNewline()).append(
" ").append(iter.next());
312 if(on && !programLinked) {
313 System.err.println(
"Error: ShaderProgram.useProgram(on "+on+
") not linked: "+
this);
316 if(programInUse==on) {
return; }
317 if( 0 == shaderProgram ) {
324 programInUse =
false;
330 for(
final Iterator<ShaderCode> iter=allShaderCode.iterator(); iter.hasNext(); ) {
331 iter.next().dumpSource(out);
336 private boolean programLinked =
false;
337 private boolean programInUse =
false;
338 private int shaderProgram = 0;
339 private final HashSet<ShaderCode> allShaderCode =
new HashSet<ShaderCode>();
340 private final HashSet<ShaderCode> attachedShaderCode =
new HashSet<ShaderCode>();
341 private final int id;
343 private static synchronized int getNextID() {
346 private static int nextID = 1;
A generic exception for OpenGL errors used throughout the binding as a substitute for RuntimeExceptio...
Convenient shader code class to use and instantiate vertex or fragment programs.
boolean compile(final GL2ES2 gl)
void destroy(final GL2ES2 gl)
StringBuilder toString(StringBuilder sb)
int program()
Returns the shader program name, which is non zero if valid.
synchronized boolean contains(final ShaderCode shaderCode)
synchronized final boolean init(final GL2ES2 gl)
Creates the empty GL program object using GL2ES2#glCreateProgram(), if not already created.
synchronized void destroy(final GL2ES2 gl)
Detaches all shader codes and deletes the program.
synchronized void useProgram(final GL2ES2 gl, boolean on)
void dumpSource(final PrintStream out)
synchronized void release(final GL2ES2 gl)
Detaches all shader codes and deletes the program, but leaves the shader code intact.
boolean equals(final Object obj)
synchronized void release(final GL2ES2 gl, final boolean destroyShaderCode)
Detaches all shader codes and deletes the program.
synchronized void notifyNotInUse()
synchronized boolean add(final GL2ES2 gl, final ShaderCode shaderCode, final PrintStream verboseOut)
Adds a new shader to a this non running program.
synchronized boolean link(final GL2ES2 gl, final PrintStream verboseOut)
Links the shader code to the program.
synchronized ShaderCode getShader(final int id)
Warning slow O(n) operation .
synchronized boolean validateProgram(final GL2ES2 gl, final PrintStream verboseOut)
Performs GL2ES2#glValidateProgram(int) via ShaderUtil#isProgramExecStatusValid(GL,...
synchronized void add(final ShaderCode shaderCode)
Adds a new shader to this program.
synchronized boolean replaceShader(final GL2ES2 gl, final ShaderCode oldShader, final ShaderCode newShader, final PrintStream verboseOut)
Replace a shader in a program and re-links the program.
int id()
returns the uniq shader id as an integer
static boolean isProgramExecStatusValid(final GL _gl, final int programObj, final PrintStream verboseOut)
Performs GL2ES2#glValidateProgram(int).
static boolean isProgramLinkStatusValid(final GL _gl, final int programObj, final PrintStream verboseOut)
static void attachShader(final GL _gl, final int program, final IntBuffer shaders)
static void detachShader(final GL _gl, final int program, final IntBuffer shaders)
int glCreateProgram()
Entry point to C language function: GLuint {@native glCreateProgram}() Part of GL_ES_VERSION_2_0,...
void glUseProgram(int program)
Entry point to C language function: void {@native glUseProgram}(GLuint program) Part of GL_ES_VERS...
void glDeleteProgram(int program)
Entry point to C language function: void {@native glDeleteProgram}(GLuint program) Part of GL_ES_V...
void glLinkProgram(int program)
Entry point to C language function: void {@native glLinkProgram}(GLuint program) Part of GL_ES_VER...