Skip to content

Commit

Permalink
Merge branch 'render-core' into render
Browse files Browse the repository at this point in the history
  • Loading branch information
dolda2000 committed Jul 11, 2020
2 parents 5f298fe + 32583aa commit 2d425b7
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 9 deletions.
11 changes: 9 additions & 2 deletions src/haven/render/gl/GLProgram.java
Expand Up @@ -50,6 +50,7 @@ public class GLProgram implements Disposable {
private final Map<Attribute, String> attrnms;
private final String[] fragnms;
private ProgOb glp;
boolean disposed = false;

public GLProgram(GLEnvironment env, ProgramContext ctx) {
this.env = env;
Expand Down Expand Up @@ -366,12 +367,17 @@ public UniformID cuniform(Uniform var) {
}

public ProgOb glid() {
if(glp == null) {
ProgOb glp;
if((glp = this.glp) == null) {
synchronized(this) {
if(glp == null)
if(disposed)
throw(new RuntimeException("reusing disposed program"));
if((glp = this.glp) == null) {
glp = new ProgOb(env,
new ShaderOb(env, GL3.GL_VERTEX_SHADER, vsrc),
new ShaderOb(env, GL3.GL_FRAGMENT_SHADER, fsrc));
this.glp = glp;
}
}
}
return(glp);
Expand Down Expand Up @@ -433,6 +439,7 @@ public void dispose() {
ProgOb cur = glp;
glp = null;
cur.dispose();
disposed = true;
}
}
}
Expand Down
44 changes: 37 additions & 7 deletions src/haven/render/gl/GLVertexArray.java
Expand Up @@ -170,17 +170,47 @@ void add(GLProgram prog, GLVertexArray vao) {
vaos[n] = vao;
progs[n] = prog;
n++;
/* XXX: This does not clean up after forgotten
* programs. Use weak refs for programs? */
}

void clean() {
int o = 0;
for(int i = 0; i < n; i++) {
if(!progs[i].disposed) {
progs[o] = progs[i];
vaos[o] = vaos[i];
o++;
} else {
vaos[i].dispose();
}
}
for(int i = o; i < n; i++) {
progs[i] = null;
vaos[i] = null;
}
n = o;
}

GLVertexArray get(GLProgram prog) {
for(int i = 0; (i < progs.length) && (progs[i] != null); i++) {
if(progs[i] == prog)
return(vaos[i]);
GLVertexArray ret = null;
boolean clean = false;
for(int i = 0; i < n; i++) {
if(progs[i].disposed)
clean = true;
if(progs[i] == prog) {
ret = vaos[i];
break;
}
}
if(ret == null) {
ret = create(prog, mod);
add(prog, ret);
}
if(clean) {
/* XXX? It would be nice if VAOs could be cleaned out
* when programs actually go away rather than when
* being re-requested. */
clean();
}
GLVertexArray ret = create(prog, mod);
add(prog, ret);
return(ret);
}

Expand Down

0 comments on commit 2d425b7

Please sign in to comment.