* Prevent shader leaks

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7891 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
sha..rd 14 years ago
parent 6c4a13ddde
commit 3bd4146f4b
  1. 14
      engine/src/core/com/jme3/shader/Shader.java
  2. 12
      engine/src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglRenderer.java

@ -98,7 +98,7 @@ public final class Shader extends GLObject implements Savable {
* Shader source describes a shader object in OpenGL. Each shader source * Shader source describes a shader object in OpenGL. Each shader source
* is assigned a certain pipeline which it controls (described by it's type). * is assigned a certain pipeline which it controls (described by it's type).
*/ */
public class ShaderSource extends GLObject implements Savable { public static class ShaderSource extends GLObject implements Savable {
ShaderType shaderType; ShaderType shaderType;
@ -236,11 +236,13 @@ public final class Shader extends GLObject implements Savable {
protected Shader(Shader s){ protected Shader(Shader s){
super(Type.Shader, s.id); super(Type.Shader, s.id);
shaderList = new ArrayList<ShaderSource>(); shaderList = new ArrayList<ShaderSource>();
// uniforms = new HashMap<String, Uniform>(); //uniforms = new ListMap<String, Uniform>();
uniforms = new ListMap<String, Uniform>(); //attribs = new IntMap<Attribute>();
attribs = new IntMap<Attribute>();
// NOTE: Because ShaderSources are registered separately with
// the GLObjectManager
for (ShaderSource source : s.shaderList){ for (ShaderSource source : s.shaderList){
addSource((ShaderSource) source.createDestructableClone()); shaderList.add( (ShaderSource)source.createDestructableClone() );
} }
} }
@ -315,7 +317,7 @@ public final class Shader extends GLObject implements Savable {
* Adds an existing shader source to this shader. * Adds an existing shader source to this shader.
* @param source * @param source
*/ */
public void addSource(ShaderSource source){ private void addSource(ShaderSource source){
shaderList.add(source); shaderList.add(source);
setUpdateNeeded(); setUpdateNeeded();
} }

@ -955,6 +955,8 @@ public class LwjglRenderer implements Renderer {
} }
source.setId(id); source.setId(id);
}else{
throw new RendererException("Cannot recompile shader source");
} }
// upload shader source // upload shader source
@ -1034,7 +1036,10 @@ public class LwjglRenderer implements Renderer {
glDeleteShader(id); glDeleteShader(id);
} else { } else {
// register for cleanup since the ID is usable // register for cleanup since the ID is usable
objManager.registerForCleanup(source); // NOTE: From now on cleanup is handled
// by the parent shader object so no need
// to register.
//objManager.registerForCleanup(source);
} }
} }
@ -1188,13 +1193,14 @@ public class LwjglRenderer implements Renderer {
logger.warning("Shader is not uploaded to GPU, cannot delete."); logger.warning("Shader is not uploaded to GPU, cannot delete.");
return; return;
} }
for (ShaderSource source : shader.getSources()) { for (ShaderSource source : shader.getSources()) {
if (source.getId() != -1) { if (source.getId() != -1) {
glDetachShader(shader.getId(), source.getId()); glDetachShader(shader.getId(), source.getId());
// the next part is done by the GLObjectManager automatically deleteShaderSource(source);
// glDeleteShader(source.getId());
} }
} }
// kill all references so sources can be collected // kill all references so sources can be collected
// if needed. // if needed.
shader.resetSources(); shader.resetSources();

Loading…
Cancel
Save